1)class Clothing{...}
2)class Person1
{
private Clothing cloth;
public void PutOn(){...};
}
3)class Person2
{
public void PutOn(Clothing cloth){...}
}以上这种2),3)两种的类的定义,实在不好把握,感觉作为成员变量与作为函数参数都是不错的选择。一直困恼很久。
这两种设计有什么不同呢?大家在设计类时,针对这种情形,采取什么样的原则,什么样的理由呢?

解决方案 »

  1.   

    我觉得这两种没有大冲突,参数传进去多半还是要赋给成员变量的,和直接用set 方法没大区别
      

  2.   

    除了九天玄狐的说法外,还有一点:代码的可读性。
    像你的这个例子,应该同时保有成员变量和函数参数,在阅读的时候可以看到——
    void putOn(Clothing c)的调用后,成员变量变为putOn的参数。
    这样可以符合人的思维习惯,理解起来会较为容易。话说面向对象的开发形式很大程度上就是图这个。
      

  3.   

    Clothing这个类要是只有public void PutOn()自己用的话使用传参数的方法好要是Clothing要是有多个方法要用的话还是private Clothing cloth通过setCloth()设置一下比较好
      

  4.   

    Person和Clothing这两个类对应的事物的关系来讲,还是3)好点.如果把Clothing作为Person的成员,那么任何东西都可以作为Person的成员,TV,House...
    但是Clothing这个类改变了,并不会影响到Person这个类.Clothing不是Person必须的一部分.如果是Arm和Person的关系,把Arm这个类作为Person的成员更合适,
    Arm这个类运作方式改变了,他会影响到Person.个人感觉
      

  5.   

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

  6.   

    orangemike(纯学习) :分析有道理
      

  7.   

    偶也倾向于orangemike(纯学习)所说的,关键看类的设计。
    是类的内部状态就肯定要用成员变量来实现,不是类的内部状态最好作为函数参数,偶尔也可以用cpp文件中匿名namespace里的变量实现(相当于文件域的全局变量
    )。
    一个对象本身应该仅仅持有那些能把它自身跟同一类的其它对象区分开来的足够状态信息就可以了(有时一些为了纯性能问题而考虑的cache成员除外)。
    比如,一个字符串因,它的字符缓冲区肯定应该做为成员变量,因为对一个字符串来说,它里面的字符是最基本的状态信息。而比较一个字符串时所需要考虑的那些因素,比如比较的开始位置,是否考虑大小写等,则应该作为函数的参数,因为这些显然不该是字符串的内部状态。
      

  8.   

    “偶尔也可以用cpp文件中匿名namespace里的变量实现(相当于文件域的全局变量)”
    ——这句去掉,没看清是在JAVA版,嘿嘿。:P