《重构..》第一章中这句话该怎么理解?

southbirdfly 2012-03-28 05:17:50
一部影片可以在生命周期内修改自己的分类,一个对象却不能在生命周期内修改自己所属的类



...全文
243 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
atlante 2012-08-10
  • 打赏
  • 举报
回复
我是这么理解的,请多指教。
一部影片可以在生命周期内修改自己的分类,有生命周期就说明这个“一部影片”是个Movie的对象movie,这个对象可以通过setType()来改变自己的分类属性。比如从Regual 变为Childrens分类属性。

一个对象却不能在生命周期内修改自己所属的类。也是这个movie对象,它一经生成后就是一个具体东西,包含了创建时的类所具有的所有特征,该对象不能对创建它的类做CRUD操作来改变创建它的类。

可是这句话不知道怎么会引出了一个State模式的解决方法。。。
muyi66 2012-03-29
  • 打赏
  • 举报
回复
我想那应该是作者认为对象不适合被杀死。实际应用里应该也会碰到类似的状况,你不能把那个对象终结,否则可能带来更麻烦的后果。

作者这样的做法实际上也是更改了属性参数,但他同时得到了新的子类方法,整个过程都被局限在对象的内部实现了,和外界的偶合也就少了。相比之下,如果你先杀死对象再重建,那就不能在对象内部实现整个过程了。
southbirdfly 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

所以我说他是用的比喻例子不是很合适,因为你能找出很多别的办法来避开他所说的问题......

他想要做到的是:建立一个对象,然后可以象更改影片子类一样的改变它的子类,并且不必先杀了它。你仔细看看他后面的做法,体会一下他是怎么做的,然后回过头来可能就理解这个例子了。
[/Quote]
谢谢你的耐心解答!
例子后面的做法,应该是Movie里面有一个Price的成员,通过将Price实例化成不同的子类的对象来使Movie具有不同的行为,看起来就好像是改变了Movie的类。 这么做是很好,但我还是不知道为什么不能用第一种做法,第一种做法会造成什么问题?? 因为我首先想到的会是第一种做法,如果不能清楚了解它造成的问题,我以后还是会首先想到用第一种做法。。。
muyi66 2012-03-29
  • 打赏
  • 举报
回复
所以我说他是用的比喻例子不是很合适,因为你能找出很多别的办法来避开他所说的问题......

他想要做到的是:建立一个对象,然后可以象更改影片子类一样的改变它的子类,并且不必先杀了它。你仔细看看他后面的做法,体会一下他是怎么做的,然后回过头来可能就理解这个例子了。
southbirdfly 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
不是这样,作者的意思是:影片不是OOP中类的实例,在同属影片这个大类的前提下我们还可以给它划分子类,而且可以改变它的子类。与此相对比,OOP中类的实例就没有这个灵活性,一旦实例化成为对象,它的……
[/Quote]

不知道是不是我表述不清楚。。。我感觉我说的和你说的应该就是一个意思。。。
问题是:如果采用第一种做法会造成什么问题? 影片可以改变分类,那我在它改变的时候重建实例不就可以了吗?从完成功能来说,我觉得完全可以做到的呀
muyi66 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
一张影片对应一个实例,实例所属的类是不变的,但影片的归类是可变的,比如今天我把它归为NEWRELEASE,明天我可以把它归为REGULAR,两者价格不同..是不是这么理解?
[/Quote]不是这样,作者的意思是:影片不是OOP中类的实例,在同属影片这个大类的前提下我们还可以给它划分子类,而且可以改变它的子类。与此相对比,OOP中类的实例就没有这个灵活性,一旦实例化成为对象,它的类就不能再改变了。
southbirdfly 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:

问题就是我看不出这个办法哪里不可行...
你所想的不是作者所想。我想他要的是一个方法,而不是一个参数。你改属性仅仅改了参数,却没有改变方法。所以作者说要用子类来实例化那些Movie。

也许他举的这个例子不是很理想,也许是我们并不了解他们那里的电影收费模式吧。
[/Quote]
一张影片对应一个实例,实例所属的类是不变的,但影片的归类是可变的,比如今天我把它归为NEWRELEASE,明天我可以把它归为REGULAR,两者价格不同..是不是这么理解?
一根烂笔头 2012-03-28
  • 打赏
  • 举报
回复

一部影片修改分类——通过多态——实现自己分类对自己的特征的修改——工厂的蓝图可以在原有基础上修改

一个对象——用类创建出来,就只包含创建时的类所具有的所有特征而不能增删——生产出的产品
深圳大哥 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

就是说一个对象从它被建立开始就已经被确定了类别了,它没法改变这一点,直到被毁灭。

其实我们自己也是这样的......不管多么不乐意,你是人类这一点就没法改变。
[/Quote]


生动形象
muyi66 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

问题就是我看不出这个办法哪里不可行...
[/Quote]你所想的不是作者所想。我想他要的是一个方法,而不是一个参数。你改属性仅仅改了参数,却没有改变方法。所以作者说要用子类来实例化那些Movie。

也许他举的这个例子不是很理想,也许是我们并不了解他们那里的电影收费模式吧。
southbirdfly 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

不是改成员属性,是改变所属子类。改属性倒是容易,改类别就没辙了。

作者只是从一个需求说起,然后设想一种解决办法,然后证明这个办法其实并不可行。再往后就可以引出新的解决方式了。
[/Quote]

问题就是我看不出这个办法哪里不可行...
muyi66 2012-03-28
  • 打赏
  • 举报
回复
不是改成员属性,是改变所属子类。改属性倒是容易,改类别就没辙了。

作者只是从一个需求说起,然后设想一种解决办法,然后证明这个办法其实并不可行。再往后就可以引出新的解决方式了。
southbirdfly 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

因为这样适应不了变化,电影在放映周期内还可以改变自己的收费类别,而一个对象创建完成就不能再改变类别了。
[/Quote]
是不是说:比如我有一个New Release Movie的实例aMovie,它有个成员type,值可能是NEWRELEASE,在运行过程中,我可以把type的值改为NORMAL,但这时候,aMovie还是New Release Movie类的实例而不是Normal Movie的实例。。也就是和类型不对应??
muyi66 2012-03-28
  • 打赏
  • 举报
回复
因为这样适应不了变化,电影在放映周期内还可以改变自己的收费类别,而一个对象创建完成就不能再改变类别了。
southbirdfly 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

就是说一个对象从它被建立开始就已经被确定了类别了,它没法改变这一点,直到被毁灭。

其实我们自己也是这样的......不管多么不乐意,你是人类这一点就没法改变。
[/Quote]

这个我理解,但把这句放在这里该怎么理解?因为我第一感觉就是子类化Movie..而且觉得子类化也能解决问题啊
muyi66 2012-03-28
  • 打赏
  • 举报
回复
就是说一个对象从它被建立开始就已经被确定了类别了,它没法改变这一点,直到被毁灭。

其实我们自己也是这样的......不管多么不乐意,你是人类这一点就没法改变。
southbirdfly 2012-03-28
  • 打赏
  • 举报
回复
哇。。图片太大了。。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧