Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 重构:何时停止重构?_Ruby_Class_Refactoring_Single Responsibility Principle_Responsibility - Fatal编程技术网

Ruby 重构:何时停止重构?

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

我非常痴迷于划分类或实例方法并将其移动到自己的类中, 很多时候,一个简单的“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
  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 )