改变对象行为......但只是一些行?

时间:2010-08-03 11:31:10

标签: design-patterns oop

你好,那里有怪胎&怪才。再次提出我的问题,谢谢你的帮助!

假设我有一个对象Foo,方法foo()大约有100行。

FOO() {  ...  QWERT  yuiop  asdfg  zxcvb  nmhjk  ... }

如果开发人员想要为foo()添加一些代码,可以使用继承,编写或装饰器模式轻松完成。

但是在他希望在代码中间修改“一行”(更改属性值,在某事物之前调用方法......)的情况下,最好的方法是什么?

foo2的() {  ...  QWERT  yuiop  ASDFG  zxcvb  nmhjk  ... }

目标是让原始开发人员定义行为,而不必担心其他人会修改/更改的内容。

新开发人员应该能够在不重新输入代码的情况下更改对象/方法/属性。

使用回调/侦听器插入中断或预定义步骤或将代码分成更小的部分不是理想的选项,因为它涉及第一个正在休眠的开发人员。 :P

对象的更改需要提交应用的提交环境怎么样? foo()正常,然后foo2只需更改所需的属性并进行提交。

还有其他选择吗?

谢谢!

5 个答案:

答案 0 :(得分:1)

将功能分解为更小的步骤。 有可能是一个100行函数不止一件事(如果没有,那么就不需要改变一条线了。)

答案 1 :(得分:0)

根据函数a()的作用,我可能会为a()创建一个可选参数,它接受一个运行的函数而不是asdf。

的Python肥胖型:

def a(foo=None):
    qert
    yuiop
    if foo is None:
        asdf
    else:
        foo()
    zxcvb
    nmhjk

a(foo=lambda: ASDF)

答案 2 :(得分:0)

封装可更改对象行为的步骤。 在C ++中,如果您不需要在运行时决定行为,那么通常会使用policy-based design。控制流在类中定义,在某些点实际完成的操作取决于模板参数。

最重要和最难的部分是相应地拆分您的方法,并且通常取决于您需要的可定制性。在做这样的事情时,请记住YAGNI。

答案 3 :(得分:0)

根据其他开发人员需要插入的内容,这可能是使用观察者模式在系统中引入钩子的候选者。

答案 4 :(得分:0)

  

但是如果他想在代码中间修改“一行”(更改属性,在某些东西之前调用一个新函数......),装饰器就不是一个选项。

     

您认为实现这一目标的正确方法是什么?(修改2行100而无需重新输入所有内容)

重新排序代码行不是问题,因为它可能只是一个复制和粘贴。您需要消除代码重复。因此,使您可以重写函数(以便下一个开发人员可以继承它或扩展它),并将所有公共代码分解为更小的单独函数。

如果您正在使用.Net,那么您也可以考虑重构函数以接受委托或lambda作为其参数之一,并且委托/ lambda在关键位置执行(这可能是您的最佳选择)。你也可以用部分类来实现你的目标 - 你编写了一些类的代码,另一个开发人员写了其余的代码,尽管这可能是你问题的一个混乱的解决方案。

  

我应该设计一个包含100个侦听器/回调的()吗?我应该定义一些“已知步骤”并使用类似“insertCodeBefore / After(step)”的内容吗?

这可能也是一个非常混乱和低效的解决方案。