标签: refactoring

在大型c#应用程序上执行批量命名空间重命名的最佳方法是什么?

首先,一点背景.

目前我们的代码库中的命名空间和程序集(约60个程序集,数千个类)看起来像

WidgetCompany.Department.Something
Run Code Online (Sandbox Code Playgroud)

我们现在已经分拆出来,因此我们正在销售驱动WidgetCompany的软件,因此我们想重命名命名空间和程序集

NewCompany.Something
Run Code Online (Sandbox Code Playgroud)

在正常情况下,我可能只是坚持使用旧命名空间,但问题是我们的客户不希望在应用程序的任何位置看到其竞争对手的名称.如果他们看到堆栈跟踪,装配属性等,它不应该出现.这并不意味着隐藏我们的员工或做任何险恶的事情,我们只需要确保人们知道我们是一个独立的实体,独立的管理,他们不需要担心数据被共享等.

现在的问题.执行此类所有包含重命名的最佳方法是什么?以下内容需要更改:

  • (几乎)应用程序中的每个类的命名空间
  • using应用程序中引用旧名称的每个语句
  • 每个项目的文件夹结构
  • 依赖于更改的文件夹结构的项目之间的引用
  • .sln文件引用已更改的文件夹结构
  • 对完全合格的那些类的任何引用(应该很少和很远)
  • 在xml配置文件中对这些类的任何引用(配置节等)
  • 每个程序集的AssemblyInfo.cs文件
  • 每个.csproj文件中的AssemblyName

我是否坚持使用寻找 - 替换祈祷策略还是有更好的东西?

.net c# refactoring visual-studio

38
推荐指数
5
解决办法
2万
查看次数

如何避免很多if else条件

我已经阅读了很多关于代码重构和避免if else语句的主题.实际上,我有一个班级,我使用了很多if - else条件.

更多细节:我正在使用pull解析器,在我的soap响应的每一行,我将检查是否有我感兴趣的标签,如果没有,检查另一个标签等:

 if(eventType == XmlPullParser.START_TAG) {
            soapResponse= xpp.getName().toString();

            if (soapResponse.equals("EditorialOffice")){  
                eventType = xpp.next();
                if (xpp.getText()!=null){
                editorialOffice += xpp.getText();
                }
            }   
            else if (soapResponse.equals("EditorialBoard")){  
                eventType = xpp.next();
                if (xpp.getText()!=null){
                editorialBoard += xpp.getText();
                }
            }
            else if (soapResponse.equals("AdvisoryBoard")){  
                eventType = xpp.next();
                if (xpp.getText()!=null){
                advisoryBoard += xpp.getText();
                }
            }   
        }
        eventType = xpp.next();
     }
Run Code Online (Sandbox Code Playgroud)

现在,我想使用somethimg else,而不是那些if else条件,但我不知道是什么.

你能给我一个例子或一个好的教程页面吗?

谢谢.

java refactoring if-statement

38
推荐指数
7
解决办法
5万
查看次数

是否有更现代的OO版"让我们构建一个编译器"?

是否有更现代的,可能是面向对象的,相当于Jack Crenshaw的" Let's Build a Compiler "系列?

不久前,我偶然发现了" 让我们编写一个编译器 ",并且无法拒绝编写一些代码.我在C#中编写了一个递归下降的C编译器,输出.NET CIL."写一次,到处泄漏"是我的口号.

太糟糕了,直到太晚才发现解析C是一场噩梦.

我现在有兴趣用Java编写一个Java编译器,它输出.NET CIL或程序集,目的是自引导.我希望可能会有更新的教程.

另外,您是否会花更多时间进行前期设计,或者只是编写大量测试来支持无情重构的能力.回想起来,我倾向于后者.编译器工作但代码非常糟糕.

java compiler-construction oop recursion refactoring

37
推荐指数
3
解决办法
6658
查看次数

有关使用遗留代码的建议

我需要一些关于如何使用遗留代码的建议.

不久前,我被赋予了向报告应用添加一些报告的任务.早在2005年就用Struts 1编写了.没什么大不了的,但是代码非常混乱.没有使用Action表单,基本上代码是一个巨大的动作,里面有很多if-else语句.此外,这里没有人具备这方面的功能知识.我们碰巧在我们的合同中有它.

我对此非常不满意,不知道如何继续.这个应用程序是看不见的:很少有人(但都非常重要)使用它,所以他们在阅读代码,标准等时不关心我的眼睛是否流血.

但是,我认为应该支付技术债务.我该怎么办呢?继续沿if-else道路前进,或者尝试以正确的方式执行此要求,忽略项目的其余部分?开始一个巨大的重构,冒着我的最后期限?

refactoring legacy-code

37
推荐指数
2
解决办法
6751
查看次数

如何确定类型是否是一种集合?

我试图确定运行时类型是否是某种集合类型.我在下面的工作,但似乎很奇怪,我必须像我所做的那样命名我认为是数组中的集合类型的类型.

在下面的代码中,通用逻辑的原因是因为,在我的应用程序中,我希望所有集合都是通用的.

bool IsCollectionType(Type type)
{
    if (!type.GetGenericArguments().Any())
        return false;

    Type genericTypeDefinition = type.GetGenericTypeDefinition();
    var collectionTypes = new[] { typeof(IEnumerable<>), typeof(ICollection<>), typeof(IList<>), typeof(List<>) };
    return collectionTypes.Any(x => x.IsAssignableFrom(genericTypeDefinition));
}
Run Code Online (Sandbox Code Playgroud)

我如何重构此代码以使其更智能或更简单?

c# collections refactoring types

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

将jupyter笔记本变成python脚本的最佳实践

Jupyter(iPython)笔记本当之无愧地被认为是一个很好的工具,用于对代码进行原型设计并以交互方式进行各种机器学习.但是当我使用它时,我不可避免地遇到以下问题:

  • 笔记本电脑很快就变得过于复杂和混乱而无法进行维护和改进,而且我必须制作python脚本;
  • 当涉及到生产代码(例如每天需要重新运行的代码)时,笔记本电脑再次不是最好的格式.

假设我在jupyter中开发了一个整机学习管道,包括从各种来源获取原始数据,清理数据,特征工程和培训模型.现在用高效可读的代码从中制作脚本的最佳逻辑是什么?到目前为止,我曾经用几种方法解决它:

  1. 只需将.ipynb转换为.py,只需稍加修改,就可以将笔记本中的所有管道硬编码为一个python脚本.

    • '+':快
    • ' - ':脏,不灵活,维护不方便
  2. 制作一个包含许多函数的单个脚本(对于每一个或两个单元格大约有1个函数),尝试使用单独的函数组成管道的各个阶段,并相应地命名它们.然后通过指定所有参数和全局常量argparse.

    • '+':使用更灵活; 更可读的代码(如果您正确地将管道逻辑转换为函数)
    • ' - ':通常情况下,管道不能拆分成逻辑上完成的部分,这些部分可以成为函数而代码中没有任何怪癖.所有这些函数通常只需要在脚本中调用一次,而不是在循环,映射等内多次调用.此外,每个函数通常都会获取之前调用的所有函数的输出,因此必须将多个参数传递给每个函数.功能.
  3. 与point(2)相同,但现在将所有函数包装在类中.现在,所有全局常量以及每个方法的输出都可以存储为类属性.

    • '+':您不需要为每个方法传递许多参数 - 所有以前的输出都已存储为属性
    • ' - ':任务的整体逻辑仍未被捕获 - 它是数据和机器学习管道,而不仅仅是类.该类的唯一目标是创建,逐个调用所有方法,然后删除.除此之外,课程实施起来还很长.
  4. 使用多个脚本将笔记本转换为python模块.我没有试过这个,但我怀疑这是解决这个问题的最长方法.

我想,这种整体设置在数据科学家中非常普遍,但令人惊讶的是我无法找到任何有用的建议.

伙计们,请分享您的想法和经验.你有没有遇到过这个问题?你是怎么解决它的?

python refactoring readability ipython-notebook jupyter

37
推荐指数
2
解决办法
8503
查看次数

如何更新旧的C代码?

我本周在工作中一直在研究一些已有10年历史的C代码,在实施了一些修改之后,我去了老板,问他是否需要做其他事情.那是他放下炸弹的时候.我的下一个任务是遍历7000行左右,了解更多代码,稍微模块化代码.我问他如何将源代码模块化,他说要开始将旧的C代码放入C++类中.

作为一名优秀的工作者,我点头表示赞成,然后回到我的办公桌,我现在坐在那里,想知道世界上如何采用这些代码,并"模块化"它.它已经有20个源文件,每个文件都有自己的用途和功能.此外,还有三个"主要"结构.这些结构中的每一个都有30多个字段,其中许多是其他较小的结构.尝试理解它是一个完全混乱,但程序中几乎每个函数都传递一个指向其中一个结构的指针并大量使用结构.

有没有什么干净的方式让我把它变成课堂?如果可以的话,我决心这样做,我只是不知道如何开始.

c c++ refactoring

36
推荐指数
6
解决办法
4172
查看次数

从需求文件中删除未使用的包

有没有简单的方法可以从需求文件中删除不再使用的包?

我为此任务编写了一个bash脚本,但是它没有按照我的预期工作.因为,某些包不遵循其PyPI项目名称.例如;

dj-database-url
Run Code Online (Sandbox Code Playgroud)

包用作

dj_database_url
Run Code Online (Sandbox Code Playgroud)

我的项目在自己的需求文件中有许多包,因此,逐个搜索它们太杂乱,容易出错并且需要花费太多时间.在我搜索时,IDE还没有这个属性.

python refactoring pip pycharm requirements.txt

36
推荐指数
4
解决办法
2万
查看次数

重构if/else逻辑

我有一个带有千行if/else逻辑方法的java类,如下所示:

if (userType == "admin") {
     if (age > 12) {
          if (location == "USA") {
               // do stuff
          } else if (location == "Mexico") {
               // do something slightly different than the US case
          }
     } else if (age < 12 && age > 4) {
          if (location == "USA") {
               // do something slightly different than the age > 12 US case
          } else if (location == "Mexico") {
               // do something slightly different
          }
     }
 } else …
Run Code Online (Sandbox Code Playgroud)

java refactoring if-statement

35
推荐指数
5
解决办法
2万
查看次数

构造函数的参数数量

我有一个类,需要将12个参数传递给它的构造函数.所以我认为这个类的设计有问题.

我想询问是否有任何关于类设计的设计模式或一般规则集合,特别是它的构造函数.

c++ parameters refactoring constructor design-patterns

35
推荐指数
3
解决办法
6416
查看次数