社区
C++ 语言
帖子详情
《重构..》第一章中这句话该怎么理解?
southbirdfly
2012-03-28 05:17:50
一部影片可以在生命周期内修改自己的分类,一个对象却不能在生命周期内修改自己所属的类
...全文
309
17
打赏
收藏
《重构..》第一章中这句话该怎么理解?
一部影片可以在生命周期内修改自己的分类,一个对象却不能在生命周期内修改自己所属的类
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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
打赏
举报
回复
哇。。图片太大了。。
重构
是什么,为什么要
重构
,怎么
重构
前言: 我们做程序员这一行的哈,说白了就是用机器能识别的语言跟机器打交道,但是经常会出现的一种情况是,我们所写的代码只有自己和机器能看得懂,其他人看懂有一定的困难性,甚至有时候过了一段时间连自己都看不懂了。。。那么此时你应该感叹自己当时的水平高超,还是该好好的反思一下了? 一,
重构
是什么 OK,闲言碎语不多讲,啥叫
重构
呢?随手打开百度,输入“
重构
”,点开百度百科...
如何
理解
重构
一、简单的
理解
重构
是在不改变软件外部行为的前提下,对其内部结构进行改变,使之更容易
理解
并便于修改。 代码重复、程序太长、嵌套过深、参数太多、接口抽象不一致、变化导致多个地方同时修改...MS理由很多很多,其实说白了,当代码看不懂的时候,往往就预示着代码需要
重构
了。 数据级的
重构
->语句级的
重构
->子程序级的
重构
->类实现的
重构
->类接口的
重构
->...
【
重构
】一、
重构
的原则
重构
的原则 文章目录
重构
的原则0什么是
重构
两顶帽子为什么要
重构
重构
改进软件的设计
重构
使软件更容易
理解
重构
能帮助找到bug
重构
提高编程速度什么时候
重构
预备性
重构
:让添加新功能更容易帮助
理解
的
重构
:使代码更容易懂捡垃圾式
重构
有计划地
重构
和见机行事的
重构
长期
重构
复审代码时
重构
怎么对leader说何时不应该
重构
重构
的挑战 0 这个系列是《
重构
——改善既有代码的设计(第2版)》的读书笔记,没错就是不久前20...
简单的
理解
<
重构
>
一,
重构
是什么
重构
(Refactoring)就是通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。但是这个解释缺少了一个前提,完整的说法应该是:在不改变软件可观察行为的前提下,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。 最近和一个朋友聊天,他说最近在读关于
重构
的书籍。但是随着阅历的提高,对这块知识比较感兴趣。 二,为什么要
重构
关于为什么要
重构
,查阅相关资料或翻阅相关书籍大多都会提到以下几句
话
通过
重构
得到更深层的
理解
通过
重构
得到更深层的
理解
是一个涉及很多方面的过程。我们有必要暂停一下,把一些要点归纳到一起。有三件事情是必须要关注的:(1) 以领域为本;(2) 用一种不同的方式来看待事物;(3) 始终坚持与领域专家对
话
。在寻求
理解
领域的过程
中
,可以发现更广泛的
重构
机会。一提到传统意义上的
重构
,我们头脑
中
就会出现这样一幅场景:一两位开发人员坐在键盘前面,发现一些代码可以改进,然后立即动手修改代码(当然还要用单元测试来验证结果)。这个过程应该一直进行下去,但它并不是
重构
过程的全部。
C++ 语言
65,214
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章