标签: refactoring

什么更好用,为什么?

class MyClass {
    private:
        unsigned int currentTimeMS;
    public:
        void update() {
            currentTimeMS = getTimeMS();
            // ...
        }
};

class MyClass {
    public:
        void update() {
            unsigned int currentTimeMS = getTimeMS();
            // ...
        }
};
Run Code Online (Sandbox Code Playgroud)

update()调用主游戏循环,所以在第二种情况下我们得到了很多分配操作(unsigned int currentTimeMS).在第一种情况下,我们只获得一个分配并使用之前分配的变量.哪个代码更好用,为什么?

c++ refactoring

0
推荐指数
1
解决办法
134
查看次数

我将如何在C#中重构三个类似的方法

我将使用哪些C#构造将这三种类似的方法重构为一种?

void func1()
  if (display.count != 0)
  {
    for (int i = display.count - 1; i >=0; --i)
    {
      if (display[i].test1())
        break;
    }
  }
}

void func2()
  if (display.count != 0)
  {
    for (int i = display.count - 1; i >=0; --i)
    {
      if (display[i].test2())
        break;
    }
  }
}

void func3()
  if (display.count != 0)
  {
    for (int i = display.count - 1; i >=0; --i)
    {
      if (display[i].test3())
        break;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

c# refactoring

0
推荐指数
1
解决办法
111
查看次数

在C++中是否可以通过类似属性的语法调用访问器?

我正在使用大型代码库,并且有许多公开定义的变量.不幸的是,访问这些变量的功能已经改变,这个新功能最好由公共​​访问器和私有实例变量封装.

所以,我正在努力做出这一改变.为此,我计划将每个公共属性设为私有,然后创建访问器.但是,我不想更改任何访问旧公共属性的代码.例如:

将公共属性更改为私有后,我有以下类:

class Test {

    private:
        int item = 5;

    public:
        int GetItem() {
             return item;
        };

        void SetItem(int new_item) {
             item = new_item;
        };
};
Run Code Online (Sandbox Code Playgroud)

在过去,"item"曾经是该类的公共属性,它通过以下方式访问:

Test* t = new Test();
int item = t->item;
Run Code Online (Sandbox Code Playgroud)

现在,我需要在检索"项目"的方式中添加新功能.例如:

int GetItem() {
     //  Some complicated code which changes "item"
     return item;
};
Run Code Online (Sandbox Code Playgroud)

我怎样才能保持相同的语法:

int item = t->item;
Run Code Online (Sandbox Code Playgroud)

但实际上这有效:

int item = t->GetItem();
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏!

c++ refactoring encapsulation accessor

0
推荐指数
1
解决办法
142
查看次数

or-assignment运算符(| =)如何工作?(C#)

我已经看到文档和答案(1) (2)试图解释| =运算符是什么以及它是如何工作的,虽然它在基本层面上有意义...我不太明白为什么或它如何实现它的功能.

解释说这a |= b相当于a = a | b,但我不知道如何评估是否给出a自身的值(a)或值b.根据我的理解,"或"意味着它可以是两件事之一,但没有具体说明它是两件事中的哪一件.

在Visual Studio中,我使用了一个名为Refactoring Essentials的扩展,它建议我用一个带有| =运算符的行替换我的一些代码,虽然代码在那里与运算符一起使用,但我对它如何完成它感到很遗憾,这促使我尝试在线研究它(因此,问这个问题).

我的代码来自

if (MessageBox.Show("Are you sure you want to cancel this operation?", "Confirm Cancel", MessageBoxButton.YesNo, MessageBoxImage.Exclamation, MessageBoxResult.No) == MessageBoxResult.No)
{
    e.Cancel = true;
}
Run Code Online (Sandbox Code Playgroud)

e.Cancel |= MessageBox.Show("Are you sure you want to cancel this operation?", "Confirm Cancel", MessageBoxButton.YesNo, MessageBoxImage.Exclamation, MessageBoxResult.No) == MessageBoxResult.No;
Run Code Online (Sandbox Code Playgroud)

它仍然有效.虽然我猜这e.Cancel是根据评估确定的MessageBox.Show(...) == MessageBoxResult.No,但我不知道为什么在那里需要| =运算符.为什么不使用标准赋值(=)运算符,因为表达式的结果是布尔值并 …

c# refactoring operators assignment-operator compound-assignment

0
推荐指数
1
解决办法
253
查看次数

将代码分离到不同的类[Java]

我有一个膨胀的JDialog类(~2000行),显示两个不相关的JTable.我想将它分成三个类(JDialog,Jtable1和JTable2).我可以研究每个表使用哪些变量和哪些方法并将它们移动到相关的类,但是这种手动重构将是乏味的.

有没有办法自动化这种重构?


要实现这一点,脚本应该有一个令牌累加器.第一个标记是,例如jTable2来自panel.add(jTable2).现在检查所有包含jTable2的行,并将标记添加到累加器.重复搜索相关的令牌,直到找不到新的令牌.现在为每个令牌找到包含它的行.展开选择以包括括号.

很难相信可论证的最大语言的程序员还没有创建这样的工具.这应该与IDE中的find usages工具非常相似.

java refactoring automated-refactoring

0
推荐指数
1
解决办法
104
查看次数

通过键调用特定方法的最有效方法 重构方法调用switch语句

我有算法给我一个整数.基于这个Integer,我想调用一个方法.每个Integer都是唯一的(如数据库中的主键),并且有一个方法可以调用.每个方法都返回相同的数据类型.这些方法都在同一个类中,并在此类中调用.

经过几个小时的搜索,我只得到这2个解决方案,但我不知道哪个是"更好"?(运行时间,资源)

切换解决方案:第一个想法,但感觉不是很好

switch (code) {
    case 1:
        nextOperation = doMethod1();
        break;

    case 2:
        nextOperation = doMethod2();
        break;

    //many more cases...

    default:
        break;
    }

public MyObject doMethod1(MyObject myObject){
    //do something with operation
    return myObject;
    }
Run Code Online (Sandbox Code Playgroud)

反射解决方案:运行时间可能不好(?)

    try{
        String methodName = "doMethod" + Integer.toString(operation.getOperationCode()); 
        //operation.getOperationCode() same like code in switch solution
        Method method = this.class.getDeclaredMethod(methodName, parametertype);
        nextOperation = (MyObject) method.invoke(this, parameter);
    }
    catch (Exception e){
        LogReport.writeLog(e.toString()); //own Log-Report filewriter
    }
Run Code Online (Sandbox Code Playgroud)

对我的问题或其他解决方案可能有更好的方法吗?如果你能给我一点提示,我会很高兴的.

java reflection methods refactoring switch-statement

0
推荐指数
1
解决办法
163
查看次数

使用django查询不违反DRY的重构方法?

我写了一个查询具有已知查找类型的模型.表示输入类型传递的标志kwargs.下面kwarg将解释查找以及传递的kwargs.

  1. 数据库哈希(随机对实例没有唯一性db_hash=True)
  2. 对象的名称("John"或"Sam"为name=True)
  3. 对象的ID.(obj.ids 124,或134as id=True)
  4. 实例(没有任何标志的objs)

例如,只是为了方法调用的名称,

self.check_all_routes("Sam", "452", name=True)
Run Code Online (Sandbox Code Playgroud)

我想重构下面的方法来减少它在违反DRY时产生的混乱.

def check_all_routes(self, driver, route, **kwargs):
    _hash = kwargs.get('db_hash')
    _name = kwargs.get('name')
    _id = kwargs.get('id')

    if _hash:
        return self.model.objects.filter(
            driver__db_hash=driver,
            route__db_hash=route
        ).prefetch_related().select_related().values_list('route_number')
    if _name:
        return self.model.objects.filter(
            driver__name=driver,
            route__name=route
        ).prefetch_related().select_related().values_list('route_number')
    if _id:
        return self.model.objects.filter(
            driver_id=driver,
            route_id=route
        ).prefetch_related().select_related().values_list('route_number')

    return self.model.objects.filter(
        driver=driver,
        route=route
    ).prefetch_related().select_related().values_list('route_number')
Run Code Online (Sandbox Code Playgroud)

可以做些什么来使它不违反DRY.

python django refactoring dry django-queryset

0
推荐指数
1
解决办法
69
查看次数

Ruby - 从数组中收集相同数字到数组数组

我创建了一个非常丑陋的脚本来从数组中收集相同的数字.我不认为这是一种非常Ruby的方式:)任何人都可以提供更干净的解决方案吗?

ar = [5, 5, 2, 2, 2, 6, 6]

collections = []
collect_same = []

while ar.length > 0
 first = ar.values_at(0).join.to_i 
 second = ar.values_at(1).join.to_i 
  if ar.length == 1 
   collect_same << ar[0]
   collections << collect_same
   break
  else  
   sum = ar.values_at(0, 1).inject {|a,b| a + b}
   if second == first 
    p collect_same << ar[0]
    ar.shift 
   else 
    collect_same << ar[0]
    collections << collect_same
    collect_same = []
    ar.shift 
   end 
  end 
end 

p collections 
Run Code Online (Sandbox Code Playgroud)

输出:

=> [[5, 5], [2, 2, 2], [6, 6]] …
Run Code Online (Sandbox Code Playgroud)

ruby arrays refactoring

0
推荐指数
2
解决办法
74
查看次数

重构在刀片中显示链接与否

我觉得这段代码看起来有点乱,逻辑是显示一个链接<a href或只显示文本.

我怎样才能重构这个看起来更清洁和可维护?

   <ol class="breadcrumb">
        <li class="{{ $active == 'sign_in'? 'active':'' }}">
            @if($active != 'sign_in')
                @php($showLink = true)
            @else
                @php($showLink = false)
            @endif

            @if($showLink)
                 <a href="{{ url_secure('sign_in') }}">
            @endif
                Sign In
            @if($showLink)
                </a>
            @endif
        </li>
        <li class="{{ $active == 'article'? 'active':'' }}"> 
            @if($active != 'article' && $showLink)
                @php($showLink= true)
            @else
                @php($showLink= false)
            @endif

            @if($showLink)
                 <a href="{{ url_secure('article')}}">
            @endif
                Articles
            @if($showLink)</a>@endif
        </li>

        <li> </li> //repeat the code logic like above
     </ol>
Run Code Online (Sandbox Code Playgroud)

如果有一种减少条件和使用循环的方法会很好.

php refactoring laravel laravel-blade laravel-5.4

0
推荐指数
1
解决办法
98
查看次数

用params重构红宝石条件

我想知道在ruby中是否有更简单的方法来处理这种情况

我的情况:

a = params[:smth].to_s == 'foo' ? 'foo2' : params[:smth].to_s
Run Code Online (Sandbox Code Playgroud)

这种情况的问题,即reek抛出使用params[:smth]2次的警告,有一种可能分配params[:smth]给变量,但也许你知道更聪明的方式?

ruby refactoring reek conditional-statements

0
推荐指数
1
解决办法
76
查看次数