Language agnostic 何时使用私有成员-何时作为函数/方法参数传递

Language agnostic 何时使用私有成员-何时作为函数/方法参数传递,language-agnostic,Language Agnostic,我经常在编写一个新类时发现自己在一个类中传递了许多私有方法的参数。另一方面,我还创建了一些私有成员,并在一种方法中使用它们 所以我的问题是“在哪些规则之后创建私有成员,何时不创建,并将变量从私有方法传递到私有方法” 你能给我一些简单的提示或提示,这样设计会更好吗?如果参数是类的“状态”的一部分,那么使用私有成员。另一方面,如果参数只是一个临时对象,则只需将其作为参数传递。我总是将变量传递到函数中。您永远不知道什么时候需要在不同的上下文中使用该函数,参数也会发生变化。创建私有数据只是为了避免传递循

我经常在编写一个新类时发现自己在一个类中传递了许多私有方法的参数。另一方面,我还创建了一些私有成员,并在一种方法中使用它们

所以我的问题是“在哪些规则之后创建私有成员,何时不创建,并将变量从私有方法传递到私有方法”


你能给我一些简单的提示或提示,这样设计会更好吗?

如果参数是类的“状态”的一部分,那么使用私有成员。另一方面,如果参数只是一个临时对象,则只需将其作为参数传递。

我总是将变量传递到函数中。您永远不知道什么时候需要在不同的上下文中使用该函数,参数也会发生变化。

创建私有数据只是为了避免传递循环数据,因为函数参数在我看来就像是伪装的全局数据。只有当数据是类的“状态”的一部分时,它才应该是类的一部分(即,在调用类的成员函数之间需要保留数据)

类应该是自包含、自维持的对象。如果使用的数据是类状态的一部分,则应使用内部变量。如果数据只是临时用于计算或其他用途,请将其作为参数传入


此外,您应该使用私有类成员,使用访问器和变异器来访问和修改它们。不要让外部代码进入类的内部。

做Python社区做的事情

提示1:不要把时间浪费在隐私上

提示2:与复杂的私有属性和方法相比,授权给策略插件(或“注入”)通常更容易处理隐私

提示3:隐私使得单元测试比需要的更复杂。把事情公之于众比较容易

提示4:只有当您的代码将由律师管理时,才可以使用private。律师需要通过隐藏算法来保护知识产权。这确实发生了,当它发生时,很明显,你必须声明事物是私有的,以防止泄露。

< P>我同意“如果一个参数是类的‘状态’的一部分,然后使用一个私有成员”,但是这立即带来一个新的问题:<强>当一个参数被认为是类的状态的一部分时?< /强>

为了对所说的话表示赞赏,我想补充一句:

如果在调用方法后需要保留该值,则参数是类状态的一部分。

示例1参数不是类状态的一部分

这辆普通车没有任何理由记住启动汽车用的钥匙

Class Car{
    Lock lock;        

    [...]

    public boolean startCar (Key keyUsedToStart){
        return (canStartCarWithThisKey (keyUsedToStart));
    }

    private boolean canStartCarWithThisKey (Key keyUsedToStart){
        return (lock.canStartCarWithThisKey(keyUsedToStart));
    }

    [...]
}
示例2参数是类状态的一部分

这辆高级轿车需要知道它有多少燃料

Class Car{
    Fuel fuel;        

    [...]

    public void putSomeFuel (Fuel fuelToAdd){
        this.fuel.add(fuelToAdd);
    }

    [...]
}

此实体是否应该与对象具有相同的生存期


当然,它不是一个在所有情况下都能给出正确答案的严格规则,但它通常工作得很好,而且非常简单……

当然,将事物声明为私有并不会真正“隐藏”您的算法-它仍然在标题中,供所有人查看。在这种情况下,你应该用pImpl来代替。@bdonlan:我同意,private并没有隐藏太多。Python没有它,没有人会错过它。这是一篇笑话,不是吗it@DanDan:没有。Python只有一个最小的私有构造——没有被广泛使用。很少有人抱怨它不见了。很少有人会为隐私的微妙之处而挣扎。
private
关键字几乎一文不值。否决票来自一种假设——因为它是用语言写的——一定有目的。我还没有看到“private”声明有什么好的用途。@S.Lott:“因为它是在语言中”——你说的有
private
声明的语言有哪些?“我还没有看到
private
声明有什么好的用途”--封装和信息隐藏是CS的基本原则。你真的希望有人站在你面前为他们辩护吗?尽量减少意外。将成员变量视为低于全局变量的一个步骤。