2014-09-25 229 views
1

假设我有与方法公共方法与私有

class SomeClass 
    def some_public_method 
    method_1 
    method_2 
    end 

其中method_1method_2不会被任何东西所使用,除非some_public_method

它们可以该方法中进行定义:

class SomeClass 
    def some_public_method 
    def method_1 
     p 'hi' 
    end 
    def method_2 
     p 'there' 
    end 
    method_1 
    method_2 
    end 
end 

或者如类私有者分别定义的。我想知道哪种方法将来更容易维护,以及为什么(应该这些方法“属于”some_public_method并且不创建,除非创建some_public_method或者它们应该属于该类)。我认为这个问题不是基于意见的,因为这是为什么。请提供一些示例,说明其他代码如何与这两种方法中的任何一种冲突,以证明您为何更好地维护更易维护的代码。

+0

'some_other_method_1'和'some_other_methods_2'?你的意思是'method_1'和'method_2'? – sawa 2014-09-25 15:34:54

+0

是的,修复它。 – daremkd 2014-09-25 15:37:54

+0

这里似乎主要是为什么你会这样做?你可以私有化或模块化这些方法。一旦你调用主方法'some_public_method',这些方法将被定义为实例方法,并且可以被实例访问并且绝不会是私有的。你能解释一下你想做这件事的理由,否则我不认为这是一个有效的SO问题。 – engineersmnky 2014-09-25 17:01:37

回答

2

在ruby中没有嵌套方法这样的事情,但是你可以编写定义新方法的方法。通过这样做:

class SomeClass 
    def some_public_method 
    def method_1 
     p 'hi' 
    end 

    def method_2 
     p 'there' 
    end 

    method_1 
    method_2 
    end 

end 

方法method_1method2,因为它们的定义还没有被执行没有定义的类被声明刚过。只要您执行some_public_method,就会执行这些定义,并将这两种方法添加到该类中。无论是公共还是私人都取决于方法privateprotectedpublic(是的,这些是方法)是否已针对课程执行。如果这些方法都没有执行,它们是公开的。

s = SomeClass.new 
t = SomeClass.new 

s.method_1  #=> undefined method error 
t.some_public_method 
s.method_1  #=> hi 

如果再次运行some_public_method,这些方法将被重新定义这可能会导致一个警告。

总之,不要嵌套方法的定义,除非你想要一些不错的元编程功能。即使这样,使用define_method方法可能也会更好。

+0

我知道如果some_public_method不是第一个,这些方法将不会被执行。我的问题是从设计的角度来看,最好是“嵌套”它们(不是字面意思),还是让它们分开定义。这一切如何运作并不是问题的关键。 – daremkd 2014-09-25 15:55:44

+0

@daremkd - 嵌套它们并不会以任何方式使它们变得私密,它们仍然可以在任何地方被任何东西执行 - 因此应该避免嵌套,除非少数情况不同。 – BroiSatse 2014-09-25 16:26:58

+0

清晰完整的答案。太好了! – 2014-09-25 17:01:26

相关问题