何时使用私有方法?

3
我了解在Java或PHP中public/protected/private访问器的含义。但是,有时候你需要将方法设置为private吗?
假设我有一个处理配置字符串的类-它们必须符合特定的正则表达式,并且如果如此,会执行进一步的逻辑以确保字符串有效。
我目前在Configuration类的私有方法中编写了这段代码。该类接受配置字符串,然后在验证字符串后将值返回给客户端代码。
然而,我想对验证代码进行单元测试,因此它应该放在另一个类中。不过,除非我知道代码将被重用,否则我通常不这样做。如果它只会像这种情况下那样被单个类使用,我通常只会将方法设置为private。
所以,我的问题是-哪些设计规则应该告诉程序员将特定的方法设置为private,而不是将其移动到自己的类中?

1
相关:你如何对私有方法进行单元测试?(特别是Jeroen的回答) - Sven Marnach
7个回答

3

单一职责原则是我通常心中所想的。同时,请考虑是否真的需要在此类中进行验证,或者它与此无关(也许应该将验证委托给域逻辑之上的另一层)。 私有方法,正如您可能已经知道的那样,不应在单元测试中进行测试。因此,如果您确实需要测试此类功能,则应将其放入自己的验证类中,仅负责验证,然后进行测试。


私有方法用于重构和改进代码可维护性。 - StuartLC
谢谢,这正是我在寻找的 - 面向对象基础。 - simon

1

如果我使用的函数只在对象中局部使用,并且不想向其他对象显示它,因为我可能会在未来使用它并犯错误,这将在我的代码中造成混乱,我就不必考虑太多要使用哪个函数和哪个不能使用。

我随处使用私有方法并编写一些简单和短小的公共方法来获取/设置对象数据,这样我就不会让代码变得混乱了。


1

在类中重构代码时,应使用私有方法。例如,如果您的代码中有一些重复出现的代码段,则应进行提取方法重构。可以查看更多的重构方法refactor


1

将您的验证逻辑实现为策略模式中的策略。这样,您不仅可以单独对它们进行单元测试,而且在需要时还可以轻松地替换验证逻辑。

因此,请创建一个单独的Validator类,该类实现IValidator接口。然后通过在Configuration的构造函数中注入它作为依赖项,将适当的验证器与您的Configuration组合起来。


0

如果没有特殊要求,成员变量应该保持私有。我认为它的主要目的是为了更好的“封装”和维护。

例如,你定义一个带有不同转向模式的Car.class。Car(.class)有一个成员变量maxSpeed,它通过setter方法Car.maxSpeedSet(int mode)设置。那么用户就不能直接知道或更改maxSpeed的值,除非通过方法来改变它的模式。

这样,用户就不需要关心或编写一个函数来获取maxSpeed从模式中获取的方式。当你需要改变函数:maxSpeed = f(mode)时,你不必在Car被使用的所有地方都去改变它,只需更改方法maxSpeedSet()。完美的封装和维护,不是吗?

如果一个成员变量只是x=a,“public”似乎已经足够了,但一定要确保将来不会更改分配方法,特别是当类有太多依赖关系时。


0

将私有验证方法保留在同一类中,并使单元测试类成为该类的友元(至少在C++中是这样,在Java中将单元测试放在同一个包中)。


0

了解更多关于SOLID设计原则的内容SOLID


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接