Ruby 重构:何时停止重构?
我非常痴迷于划分类或实例方法并将其移动到自己的类中, 很多时候,一个简单的“helloworld”方法会被划分成许多类 比如说Ruby 重构:何时停止重构?,ruby,class,refactoring,single-responsibility-principle,responsibility,Ruby,Class,Refactoring,Single Responsibility Principle,Responsibility,我非常痴迷于划分类或实例方法并将其移动到自己的类中, 很多时候,一个简单的“helloworld”方法会被划分成许多类 比如说 class MainProgram def hello_world puts "hello world" end end 将分为 class SayHello def initialize @hello = "hello" end def hello @hello end end class SayWorld d
class MainProgram
def hello_world
puts "hello world"
end
end
将分为
class SayHello
def initialize
@hello = "hello"
end
def hello
@hello
end
end
class SayWorld
def initialize
@world = "world"
end
def world
@world
end
end
class SayHelloWorld
def initialize
@hello = SayHello.new.hello
@world = SayWorld.new.world
@hello_world = "#{@hello} #{@world}"
end
def hello_world
@hello_world
end
end
class MainProgram
def hello_world
@hello_world = SayHelloWorld.new.hello_world
@hello_world
end
end
有时觉得没必要。这样做有什么好处吗
我什么时候停止重构代码?
是否存在重构代码?只有当您看到代码的代码重复足够复杂(或包含业务逻辑)时,才应启用“重构模式”,这可能会在以后进行维护/更新时导致问题;这样,它将创建一个场景,在该场景中,您可能会忘记更新所有在功能上完全相同的代码位置,从而导致依赖于代码路径的功能行为不一致
一个常见的规则是,一旦看到3个重复的非平凡代码,就应该对其进行重构
重构可以实现可重用性,但它与制作可重用的软件组件(我认为这是您的动机)并不完全相同
你所做的是过度设计你的软件,基本上是将你的编程语言强大而简洁的语法简化为一种更简单、更脆弱、表达能力更低的语法。这是因为您正在创建太多的抽象层,并将基本表达式封装到类中
您应该问自己一个有用的问题:“将这一系列表达式转换为一个类有什么好处?”例如,“我需要跟踪状态吗?”,“多个实例有意义吗?”,以及“我是否获得或失去了表达能力?灵活性?方便性?”
从另一个角度来看,重构的动机通常是(不要重复你自己),记住DRY与想要创建可重用的软件组件并不完全相同。然而,也有(你不会需要它):除非你在不久的将来需要某种功能,你可能不需要现在就实现它,只要坚持最基本的版本就行了(至少从一开始)
不要猜测未来的想法“我想把所有的选择留给以后;如果我决定做A
,如果我决定做B
,是的,是的,我将把这个简单的东西变成一个类,让你也可以做f
,g
和h
,以防万一我以后决定需要它。。。!“
因此,在开始编写相关代码之前,这与将您的软件需求和范围确定在一个相当稳定的最终水平有关。了解道路的终点有助于您估计需要多少燃料,如何正确调整自己的速度,并根据最需要的地方按比例应用资源
此外,如果你是编程和学习一门语言的新手,即使你不需要,你也很可能会觉得有必要在你的程序中保留每一种语言功能。当你开始编写更复杂的、真实的程序(远远超出hello world)时,你会感觉到什么时候该使用什么
了解是加速此过程的最佳方法之一。您当前正在执行一种形式的“”这完全取决于哪些内容保持不变,以及哪些更改。如果需要打印相同的字符串,请单击“Hello World”“一直以来,您都不需要所有的复杂性。如果您认为希望每隔一段时间更改一次字符串,但更改频率不如每次运行时,那么您可能希望将该字符串保持为常量,并引用该常量。如果您希望输出根据用户输入的不同而变化,如
“Hello world”
、“Hello Mars”
、“Hello Moon”
等,那么您可以将“Hello”
部分硬连线,并为不同部分设置用户输入例程。等等。直觉上,每个人都知道如何编写“Hello world”程序:
那么,为什么要费心到处乱跑呢?答案是,为了未来。如果你只是想现在就向世界问好,而在你的编程生涯中再也不这样做了(这是正常的情况),那么就写一行。何时停止重构的问题取决于当前编程工作的预期未来用途。例如,如果您正在编写一个网站,该网站将来应该是多语言的,您将执行以下操作:
class Greeter
GREETINGS = {
en: "hello",
ru: "привет",
cn: "你好"
}
TARGET = {
en: "world",
ru: "мир",
cn: "天地"
}
def do_your_grim_business( language )
puts [ GREETINGS[ language ], TARGET[ language ] ].join( ", " ) + "!"
end
alias :act :do_your_grim_business
end
timothy = Greeter.new
timothy.act( :en )
这将使你的思想成长,扩展到光明的未来。但不要做得过火,因为正如那些犯了错误的人所说的那样,。这是一个主观的问题——我认为这不适合StackOverflow。这看起来更像是“重新分解”:。当朋友们开始对其关于重构的历史提出任何评论/疑问时(有点):。如果您需要重构,如果不需要,就不要重构。您仍然需要逻辑来管理每种语法语言强加的顺序:-)没错。顺便说一句,感谢问题评论中的链接。我会删除复制的“非平凡”限定:无论多么平凡,如果它被复制了3次,你肯定会忘记至少在一个地方更改它。“非平凡”限定符是为了防止人们“重构”成像
add\u then\u mult(a,b,c)这样的函数{return(a+b)*c;}
,或添加新行(ostream){ostream
class Greeter
GREETINGS = {
en: "hello",
ru: "привет",
cn: "你好"
}
TARGET = {
en: "world",
ru: "мир",
cn: "天地"
}
def do_your_grim_business( language )
puts [ GREETINGS[ language ], TARGET[ language ] ].join( ", " ) + "!"
end
alias :act :do_your_grim_business
end
timothy = Greeter.new
timothy.act( :en )