它通常认为,复制和粘贴编程是一个坏主意,但什么是处理,你有两种功能或代码块的情况下最好的办法,真正做需要在短短的方式不同品牌推广他们非常凌乱?
如果代码基本相同,除了一些小的变化,但是那些微小的变化不是通过添加参数,模板方法或类似的东西很容易分解的东西怎么办?
更一般地说,您是否曾经遇到过这样一种情况,即您承认一点点复制粘贴编码是真正合理的.
问这个关于你的功能的问题
"如果这个小要求发生变化,我是否必须改变这两个功能才能满足它?"
当然,它有时是可以接受的.这就是人们保留片段文件的原因.但是,如果您经常剪切和粘贴代码,或者使用多行代码,那么您应该考虑将其作为子例程.为什么?因为你必须改变一些东西,这样,你只需要改变一次.
中间情况是使用宏,如果你有这样的可用.
我听说有人说会复制和粘贴一次(限制重复代码到最多两个实例),因为除非你在三个或更多地方使用代码,否则抽象不会得到回报.()我自己,一旦看到需要,我就试着让它成为重构的好习惯.
是的,就像你说的那样; 较小但很难因素的变化.如果情况确实如此,请不要鞭挞自己.
是.当细分市场略有不同时,您正在使用一次性系统(系统存在的时间非常短,不需要维护).否则,通常更好地提取出共性.
如果差异在于数据,则通过提取函数并使用数据中的差异作为参数来重构(如果要将数据作为参数传递太多,请考虑将它们分组到对象或结构中).如果差异在函数的某个进程中,则使用命令模式或抽象模板进行重构.如果即使使用这些设计模式仍然很难重构,那么您的功能可能会尝试自己处理许多责任.
例如,如果您的代码段在两个段中有所不同 - diff#1和diff#2.在diff#1中,你可以拥有diff1A或diff1B,而对于diff#2你可以拥有diff2A和diff2B.
如果diff1A和diff2A总是在一起,并且diff1B和diff2B总是在一起,那么diff1A和diff2A可以包含在一个命令类或一个抽象模板实现中,diff1B和diff2B可以包含在另一个中.
但是,如果有几种组合(即diff1A和diff2A,diff1A和diff2B,diff1B和diff2A,diff1B和diff2B),那么你可能想重新考虑你的功能,因为它可能试图自己处理太多的责任.
使用逻辑(if-else,循环)动态构建SQL会牺牲可读性.但是创建所有SQL变体将很难维护.所以遇到中途并使用SQL Segments.将共性作为SQL段提取出来,并将这些SQL段作为常量创建所有SQL变体.
例如:
private static final String EMPLOYEE_COLUMNS = " id, fName, lName, status"; private static final String EMPLOYEE_TABLE = " employee"; private static final String EMPLOYEE_HAS_ACTIVE_STATUS = " employee"; private static final String GET_EMPLOYEE_BY_STATUS = " select" + EMPLOYEE_COLUMNS + " from" + EMPLOYEE_TABLE + " where" + EMPLOYEE_HAS_ACTIVE_STATUS; private static final String GET_EMPLOYEE_BY_SOMETHING_ELSE = " select" + EMPLOYEE_COLUMNS + " from" + EMPLOYEE_TABLE + " where" + SOMETHING_ELSE;