日期:2014-05-20  浏览次数:20761 次

成员变量好,还是函数参数好
1)class   Clothing{...}
2)class   Person1
{
private   Clothing   cloth;
public   void   PutOn(){...};
}
3)class   Person2
{
public   void   PutOn(Clothing   cloth){...}
}

以上这种2),3)两种的类的定义,实在不好把握,感觉作为成员变量与作为函数参数都是不错的选择。一直困恼很久。
这两种设计有什么不同呢?

大家在设计类时,针对这种情形,采取什么样的原则,什么样的理由呢?

------解决方案--------------------
看实际需求了!

------解决方案--------------------
原则:有外部引用的时候需要参数传递,没有外部引用的时候一律用成员变量.理由:类安全
------解决方案--------------------
我觉得这两种没有大冲突,参数传进去多半还是要赋给成员变量的,和直接用set 方法没大区别
------解决方案--------------------
除了九天玄狐的说法外,还有一点:代码的可读性。
像你的这个例子,应该同时保有成员变量和函数参数,在阅读的时候可以看到——
void putOn(Clothing c)的调用后,成员变量变为putOn的参数。
这样可以符合人的思维习惯,理解起来会较为容易。

话说面向对象的开发形式很大程度上就是图这个。

------解决方案--------------------
Clothing这个类要是只有public void PutOn()自己用的话使用传参数的方法好

要是Clothing要是有多个方法要用的话还是private Clothing cloth通过setCloth()设置一下比较好
------解决方案--------------------
Person和Clothing这两个类对应的事物的关系来讲,还是3)好点.

如果把Clothing作为Person的成员,那么任何东西都可以作为Person的成员,TV,House...
但是Clothing这个类改变了,并不会影响到Person这个类.Clothing不是Person必须的一部分.

如果是Arm和Person的关系,把Arm这个类作为Person的成员更合适,
Arm这个类运作方式改变了,他会影响到Person.

个人感觉
------解决方案--------------------
尽量缩小变量的作用域
------解决方案--------------------
从LZ提问的方式,我感觉你把这个当作一个技巧性问题提的,其实这个问题是个面向对象的思想问题。把Clothing当作属性或者方法参数,是有本质区别的,关键是要看你的实际应用的对象模型是怎么建立的。如果在你的模型里,一个人只需要有手有脚即可,至于他穿什么衣服,别的类都不会在意,只是在某个场景里,put一下Clothing显摆一下就行,那么你肯定只需要把它做为一个方法参数就行了。但是如果你的模型里还有个party类要求检查参加party的person的衣服,不是礼服不能参加,那你肯定把Clothing作为person的属性比较好。其实意思和“九天玄狐”说的差不多。
------解决方案--------------------
原则:有外部引用的时候需要参数传递,没有外部引用的时候一律用成员变量.理由:类安全

To:九天玄狐,你的这句话我还是没能理解,能讲具体,或者举个例子吗??谢谢!!
------解决方案--------------------
学习
------解决方案--------------------
orangemike(纯学习) :分析有道理
------解决方案--------------------
偶也倾向于orangemike(纯学习)所说的,关键看类的设计。
是类的内部状态就肯定要用成员变量来实现,不是类的内部状态最好作为函数参数,偶尔也可以用cpp文件中匿名namespace里的变量实现(相当于文件域的全局变量
)。
一个对象本身应该仅仅持有那些能把它自身跟同一类的其它对象区分开来的足够状态信息就可以了(有时一些为了纯性能问题而考虑的cache成员除外)。
比如,一个字符串因,它的字符缓冲区肯定应该做为成员变量,因为对一个字符串来说,它里面的字符是最基本的状态信息。而比较一个字符串时所需要考虑的那些因素,比如比较的开始位置,是否考虑大小写等,则应该作为函数的参数,因为这些显然不该是字符串的内部状态。
------解决方案--------------------
嘿嘿...
------解决方案--------------------
这两种方式所定义的变量作用域并不相同,相对是比较容易做出抉择的吧。

第一种方式将其定义为类的作用域,也就是说类的其他函数或许会引用该变量。

第二种方式将其定义为方法的作用域,也就是说类的其他函数不会引用该变量,该变量的只能被该方法使用。