标签: refactoring

对集合进行分组并返回字典

我写了一个方法,它收集了一些项目(价格项 - 每个项目都有一个数量和一个代码),然后按代码对它们进行分组,然后返回一个IDictionary,其中键是项目的代码,值是组带有该代码的项目(希望有意义!)

这是方法的实现:

public IDictionary<string, IEnumerable<PriceDetail>> GetGroupedPriceDetails(IEnumerable<PriceDetail> priceDetails)
{
    // create a dictionary to return
    var groupedPriceDetails = new Dictionary<string, IEnumerable<PriceDetail>>();

    // group the price details by code
    var grouping = priceDetails.GroupBy(priceDetail => priceDetail.Code);

    // foreach grouping, add the code as key and collection as value to the dictionary
    foreach (var group in grouping)
    {
        groupedPriceDetails.Add(group.Key, group);
    }

    // return the collection
    return groupedPriceDetails;
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试重构这个使用ToDictionary,如下所示:

// group the price details by code and return
return priceDetails.GroupBy(priceDetail => priceDetail.Code) …
Run Code Online (Sandbox Code Playgroud)

.net c# linq refactoring

17
推荐指数
2
解决办法
1万
查看次数

在多个mapper.xml中重用MyBatis ResultMap

我想重新使用来自不同*Mapper.xml文件的特定文件,这些文件都以某种方式读取相同的对象.

我有一个名为Project的数据库表,我创建了以下resultMap:

<resultMap id="ProjectMap" type="com.model.Project">
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="client_prj_no" jdbcType="VARCHAR" property="clientPrjNo" />
    <result column="notes" jdbcType="VARCHAR" property="notes" />
    <result column="start_date" jdbcType="TIMESTAMP" property="startDate" />
    ...
<resultMap>
Run Code Online (Sandbox Code Playgroud)

它在ProjectMapper.xml中工作得很好,但是,现在我想创建一个ClientWithProjectsMapper.xml,我想要SELECT*FROM CLIENT,PROJECT,其中PROJECT.CLIENT_ID = CLIENT.ID并且Client对象返回一个List对象.换句话说,我想用一个SQL获取ClientWithProjects.

在我的映射中,我想重用我在ProjectMapper.xml中定义的ProjectMap(没有复制/粘贴),但我不知道如何实现这一点.

我可以将ProjectMap分解为一个单独的文件,但我没有在MyBatis中找到#include其他文件的任何工具.

关于如何做到这一点的任何想法?(我正在使用Maven,是否有任何插件可以过滤寻找#include等文件,并将文件内容直接包含在正在处理的文件中?).

谢谢.

-AP_

refactoring resultset mappers mybatis

17
推荐指数
1
解决办法
2万
查看次数

你如何证明重复工作给你的吝啬老板?

您刚刚编写了一堆代码,以便在压力下提供一些重要功能.你已经削减了一些角落,你已经将一些代码混合到一些名称如SerialIndirectionShutoffManager的过度膨胀的类中.

你告诉你的老板,你需要一周的时间来清理这些东西.

"干什么?"

"我的代码 - 它是一个猪圈!"

"你的意思是还有一些bug修复?"

"不是真的,它更像......"

"你会让它跑得更快吗?"

"也许,但不是......"

"那么当你有机会的时候你应该写得很好.现在我很高兴你在这里,是的,我将不得不继续前进,并要求你在这个周末来这里."

我读过Matin Fowler的书,但我不确定我是否同意他对此事的建议:

  • 鼓励定期进行代码审查,因此鼓励重构工作作为开发过程的自然部分.
  • 只是不要说,你是开发人员,也是你职责的一部分.

这两种方法都不需要与您的经理沟通.

你告诉老板你怎么了?

refactoring

16
推荐指数
5
解决办法
2203
查看次数

你怎么处理恶劣的代码?

当你被分配到那些令人厌恶和过时的代码时,你会怎么做?这几乎是不可理解的?

例如:硬件接口代码,混合逻辑,AND用户界面代码,ALL在同一个功能中?

我们一直看到不好的代码,但你实际上对它做了什么?

  • 你试着重构它吗?
  • 如果不是的话,试着把它做成OO吗?
  • 或者您是否尝试了解它,进行必要的更改并继续前进?

refactoring

16
推荐指数
4
解决办法
1440
查看次数

rails通过迁移删除旧模型

我有一堆rails模型,我正在重写为单个模型,以简化我的代码并减少不必要的表.

我想知道删除模型类及其表的最佳方法是什么.我希望过去的迁移仍能成功,但我不想让空模型四处闲置.我是否必须手动删除引用这些模型的旧迁移,然后手动删除类文件?

有没有人有最好的方法来做到这一点?

migration refactoring ruby-on-rails

16
推荐指数
4
解决办法
1万
查看次数

我的网址中的问号名称是什么?

http://example.com/foo.aspx?foo=bar

我正在重构并且需要命名常量,该常量只包含该字符串的问号字符.我不确定最好给这个变量命名,因为我从来不知道该问号的正确名称是什么.

我该怎么命名常数?或者...... .NET中有什么东西是更明智的选择(内置的东西,其值已经是问号 - 或者在给出名称/值对集合的情况下为我自动构建查询字符串)?

.net refactoring naming-conventions

16
推荐指数
3
解决办法
2240
查看次数

Rails:重构,观点,帮助者:这一切是如何结合在一起的?

警告:Noob在这里.

我知道这是一个微不足道的主题,但是我很难弄清楚如何通过将他们的部分内容转化为帮助来简化我的观点.例如,我一直认为你的视图中的条件是提取助手的主要候选者,但我无法找到这样的例子,而我实现这一目标的尝试失败了.

例如,假设我有:

#index.html.erb

<% for beast in @beasts do -%>
  <% if beast.dead? -%>
    <%= beast.body %>
    <%= link_to "bury", bury_beast_path( :id => beast.id ) %>
  <% else -%>
    <%= beast.body %>
    <%= link_to "kill!", kill_beast_path( :id => beast.id ) %>
  <% end -%>
<% end -%>
Run Code Online (Sandbox Code Playgroud)

在我看来,这让我有点恼火,但我怎么能把它转移到助手呢?如果可能的话,进一步简化它.(我已经读到某个条件很糟糕的地方,但是如果没有它们,你可以编程任何东西.)

又如:我需要idbody的格式标记controller_action.到目前为止我得到的最好的是:

#index.html.erb

<body id="<%= controller_action %>">
Run Code Online (Sandbox Code Playgroud)

…和…

#application_helper.rb

def controller_action
  @id = @controller.controller_name + "_" + @controller.action_name
end
Run Code Online (Sandbox Code Playgroud)

我不是专家,但即使对我来说,这仍然是丑陋的.

为了使事情变得更复杂,Ryan Singer说了一些我喜欢的事情:将ERB视为图像标签,使用帮助器"揭示意图".然后在下一次呼吸说你应该没有助手的HTML,这是地狱的方式.WTF?两者如何兼容?如果它可以在视图中声明行为,那么肯定应该在幕后呈现大量的HTML吗?我无法掌握它.

所以,基本上就是这样.我很感激,如果有人可以分享一些关于这方面的想法,或者指出我对这个主题有一些深入的阅读 - …

refactoring views ruby-on-rails helper

16
推荐指数
2
解决办法
7395
查看次数

如何降低Cyclomatic Complexity?

我有一个接收Object的方法,并根据它检测到的对象类型做一些事情:

void receive(Object object) {
    if (object instanceof ObjectTypeA) {
        doSomethingA();
    }
    else {
        if (object instanceof ObjectTypeB) {
            doSomethingB();
        }
        else {
            if (object instanceof ObjectTypeC) {
                doSomethingC();
            }
            else {
                if (object instanceof ObjectTypeD) {
                    doSomethingD();
                }
                else {
                    // etc...
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何降低Cyclomatic Complexity?我四处搜索但找不到任何有用的东西.

java refactoring cyclomatic-complexity instanceof

16
推荐指数
3
解决办法
5万
查看次数

捕获特定异常

如何使用c#捕获特定的异常?
在我的数据库中,某些列上有唯一索引.
当用户插入重复记录时,抛出此异常:

无法在对象'dbo中插入重复的键行.BillIdentity'具有独特的指数'IX _BillIdentity'.该语句已终止.

我怎么能抓住这个例外?
目前我正在检查使用此代码:

 catch (Exception ex) {
    if (ex.Message.Contains("Cannot insert duplicate key row in object 'dbo._BillIdentity' with unique index 'IX__BillIdentity")) {
        string ScriptKey = "$(function() {ShowMessage('Error');});";
        ScriptManager.RegisterStartupScript(Page, GetType(), "script", ScriptKey, true);
    }
}
Run Code Online (Sandbox Code Playgroud)

我觉得它的味道很难闻.
有没有更好的方法?

c# refactoring exception-handling

16
推荐指数
3
解决办法
3万
查看次数

IntelliJ中的简单自定义重构

这个问题是一个跟进这个.

说我有一些课Foo.

class Foo {
    protected String x = "x";

    public String getX() {
        return x;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个程序使用Foo并违反了LoD(Demeter法则).

class Bar {
    protected Foo foo;

    public Bar() {
        this.foo = new Foo();
    }

    public Foo getFoo() {
        return foo;
    }
}

public static void main(String [] args) {
    Bar bar = new Bar();
    String x = bar.getFoo().getX(); 
}
Run Code Online (Sandbox Code Playgroud)

我可以通过两个步骤重构此代码以使用LoD.

  1. m bar.getFoo().getX()- > getFooX(bar)(提取到方法,也可以查找和替换出现)
  2. F6 getFooX(bar)- > bar.getFooX()(转到实例方法,也找到并替换出现)

使用的程序Bar不再违反LoD. …

java refactoring intellij-idea law-of-demeter automated-refactoring

16
推荐指数
1
解决办法
1276
查看次数