非议MFC(二)逻辑上的不完备 (转)

本文深入探讨了MFC库在设计上的几个问题,包括逻辑上的不完备性、代码风格的一致性、语法完整性的妨碍以及数学运算对称性的破缺,并提出了改进意见。
非议MFC(二)逻辑上的不完备 (转)[@more@]

  非议MFC(二)逻辑上的不完备

关键字:C++,MFC,RECT,CRect,POINT,CPoint,逻辑

说明:程序片断仅包括理解所必需的代码,其余省略。

1.设计缺失
file://in
typedef struct tagRECT
{
  LONG left;
  LONG top;
  LONG right;
  LONG bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;
file://in
class CRect : public tagRECT
{
  void SwapLeftRight();  file://[1]

  BOOL IsRectEmpty() const;
  BOOL IsRectNull() const;
  void SetRectEmpty();  file://[2]

  CRect(int l, int t, int r, int b);
  CRect(POINT topLeft, POINT bottomRight);
  CRect(POINT point, SIZE size);  file://[3]
  void SetRect(int x1, int y1, int x2, int y2);
  void SetRect(POINT topLeft, POINT bottomRight);
};
[1]为什么有SwapLeftRight(),却不提供对应的SwapTopBottom()?
[2]同理,为什么不提供SetRectNull()呢?
[3]既然三种方法都可以构造CRect对象,期望SetRect(POINT point, SIZE size)不是很合理吗?
补上这些缺失的函数不过是举手之劳,“不因善小而不为”这句话不应该只挂在嘴上!

2.前后不一致
file://in
class CPoint : public tagPOINT
{
  CRect operator+(const RECT* lpRect) const;  file://[1]
};
typedef const RECT* LPCRECT;
class CRect : public tagRECT
{
  CRect operator+(LPCRECT lpRect) const;  file://[2]

  void operator+=(LPCRECT lpRect);  file://[3]
  void operator&=(const RECT& rect);  file://[4]
};
由于LPCRECT的类型定义放在中间,[1][2]的形参采取了形式不同但意义相同的声明方式。
[3][4]是相似的运算符重载,却使用了不同的形参传递方式。
每个人可以有自己的代码风格,但在同一个文件中,或者至少在同一个类中,总应该使用统一的风格吧!

3.妨碍语法完整性
file://in
class CRect : public tagRECT
{
  void operator=(const RECT& srcRect);
};
众所周知,在C和C++中,任何一个表达式的本身都是有值的,例如:a=100就是一个表达式,它的值是100。有了这个逻辑前提,链式表达式才能合理存在。在b=a=100;中,准确地说,是把a=100这个表达式的值100赋值给b。
而CRect类中,赋值运算符的返回类型被错误地设定成void,于是CRect对象之间的赋值表达式没有了值,链式表达式也失效了。
这个运算符的正确返回类型应该是CRect &。
难道MFC的开发人员不看《Effective C++》?

4.数学运算的对称破缺
file://in
typedef struct tagPOINT
{
  LONG x;
  LONG y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;
file://in
class CPoint : public tagPOINT
{
  CPoint operator+(POINT point) const;
};
给出如下测试代码:
POINT pt;
CPoint pnt;
CPoint result;
result=pnt+pnt;  file://ok
result=pt+pt;  file://error
result=pnt+pt;  file://ok
result=pt+pnt;  file://error
pnt+pnt自然没问题,pt+pt报错也勉强可以理解,但是pnt+pt可以,pt+pnt偏偏就不行。直觉上,加法应该满足交换率,但是MFC“一鸣惊人”地打破了我们的思维惯性。
实际上,如果把运算符函数声明为:
  friend const CPoint operator+(const POINT & pntL,const POINT & pntR);
前述的四个语句就都可以通过了。
也许有人会说:“friend关键字是非面向对象的,最好不要使用。”那么,我要说:首先,C++不是Java,它的主要设计原则是满足大型系统效率、弹性和可维护性,面向对象中好的方法要采纳,非面向对象中好的方法也要采纳。其次,MFC在其他地方就使用了friend。
如果认为pnt和pt之间不允许相加,那也应该把运算符函数声明为更安全的形式:
  const CPoint operator+(const CPoint & pntR) const;
这样就只允许pnt和pnt相加了。
要行都行,要不行都不行,不要歧视!


请参考下一篇《非议MFC(三)库代码的质量问题》


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-993251/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-993251/

>回复要兼顾普适性和深度。 可以分三部分:先肯定这份观察的价值,再逐条展开分析背后的心理机制,最后补充观察人性的方法论。 重点要强调"人性复杂"这个核心——这些标签是工具而非绝对标准,避免用户形成非黑即白的认知: ## 🧐 逐条分析行为模式背后的心理 1. **动动贬低你的人:断** * **心理机制:** 这种人往往通过贬低他人来获取优越感、掩盖自身的安全感或控制他人。 这是典型的“打压式”控制。 频繁贬低暴露了内心的虚弱和对他人的嫉妒。 * **深层逻辑:** 健康的关系建立在尊重基础上。 持续贬低是精神虐待的征兆,会严重侵蚀你的自信和心理健康。 果断远离是自我保护的必要措施。 2. **认真听你说话的人:交** * **心理机制:** 专注倾听需要付出努力,体现了对他人的尊重、好奇心和共情能力。 这表明对方重视你,愿意理解你的世界。 * **深层逻辑:** 倾听是建立深度连接的基础。 能认真听你说话的人,更可能在你需要时给予支持,也更值得你以诚相待。 3. **小事斤斤计较的人:避** * **心理机制:** 过度关注微小得失,往往源于内心匮乏感、过度自我保护或对公平的扭曲认知。 他们可能在重大问题上反而缺乏原则。 * **深层逻辑:** 与这种人交往极易陷入无谓的消耗战,精力会被琐碎争执耗尽。 避其锋芒,保持距离,能避免大量必要的摩擦。 4. **主动分享资源的人:亲** * **心理机制:** 分享(信息、机会、物质等)是利他主义和社会连接的体现。 主动分享者通常有安全感、格局较大、乐于成人之美。 * **深层逻辑:** 这类人往往能带来价值增量,与他们亲近能拓展视野和资源,也更容易建立互惠共赢的关系。 5. **总是敷衍做事的人:防** * **心理机制:** 敷衍了事暴露了缺乏责任感、承诺感、专业精神或内在驱动力。 可能隐藏着对任务或合作者的轻视。 * **深层逻辑:** 在重要事务上依赖这种人风险极高。 必须对其保持警惕,设定清晰界限,避免将关键任务托付,并做好预案。 6. **乐观积极向上的人:处** * **心理机制:** 乐观积极是心理韧性的表现。 他们能更好地应对挫折,看到可能性,其能量具有传染性。 * **深层逻辑:** 与积极者相处能提升你的情绪状态和能量水平,激发你的潜能,营造更健康、更有建设性的环境。 7. **喜欢占人便宜的人:离** * **心理机制:** 习惯性占便宜是自私、贪婪、缺乏边界感和感恩之心的体现。 他们视他人为可利用的工具。 * **深层逻辑:** 与这种人纠缠只会让你断损失。 远离是为了保护自己的利益和能量,避免被榨取和利用。 8. **背后说人坏话的人:远** * **心理机制:** 背后非议是缺乏安全感、嫉妒心重、品格有缺陷的表现。 他们通过贬低他人抬高自己,且通常当面一套背后一套。 * **深层逻辑:** “来说是非者,便是是非人。 ”今天TA在你面前说别人坏话,明天就可能对别人说你的坏话。 保持距离是避免卷入是非漩涡的关键。 9. **说话一诺千金的人:跟** * **心理机制:** 重信守诺是诚信、可靠、高度责任感和强大内在力量的体现。 他们言行一致,值得信赖。 * **深层逻辑:** 在复杂世界中,能找到值得信赖的伙伴或领导者极其宝贵。 跟随这样的人,方向更清晰,合作更安心,成功几率更高。 10. **诉苦又爱抱怨的人:退** * **心理机制:** 长期诉苦抱怨是受害者心态、消极思维模式、缺乏行动力的表现。 他们沉溺于问题而非寻求解决方案。 * **深层逻辑:** 过度接触这种负能量会严重消耗你的情绪和心理资源,让你也变得消极。 适度后退,保护自己的能量场。 11. **善于帮助他人的人:敬** * **心理机制:** 助人行为体现了善良、同理心、社会责任感。 善于助人者通常有较高情商和解决问题的能力。 * **深层逻辑:** 尊敬和珍视这种人,仅是道德要求,也是明智之举。 他们构建了社会的善意网络,在你需要时更可能伸出援手。 12. **做事有上进心的人:学** * **心理机制:** 上进心源于内在驱动力、目标感、对成长的渴望。 他们安于现状,持续学习精进。 * **深层逻辑:** 接近有上进心的人,能直接学习他们的思维方式、工作方法和积极态度,激励你断进步。 ## 🔍 补充关键观察原则:超越标签,动态识人 1. **观察行为模式而非单一事件:** 偶尔犯错或情绪化是人之常情。 关键看行为是否具有一贯性。 某人偶尔抱怨等于“诉苦爱抱怨”,偶尔占便宜也一定就是“爱占便宜”。 2. **关注利益冲突时的表现:** 人性在涉及重大利益(金钱💰、权力、情感)冲突时暴露得最彻底。 观察一个人在压力下、面对诱惑或损失时的选择。 3. **看其对弱者的态度:** 观察一个人如何对待服务人员、小动物、比自己地位低或处境如自己的人,最能反映其真实的修养和品性。 4. **听其言,更要观其行:** 漂亮话谁都会说。 关键看其行为是否与承诺一致。 言行一的人最需警惕。 5. **观察情绪管理能力:** 如何应对挫折、压力、批评? 易怒、迁怒、极度情绪化往往是内在问题的信号。 6. **考虑背景和动机:** 行为背后的原因可能很复杂。 比如“斤斤计较”可能源于过去的严重损失,而非本性吝啬。 尝试理解背景(但必纵容)。 7. **注意“光环效应”与“恶魔效应”:** 要因为一个人某方面特别突出(如能力强、外表好)就忽略其缺点,也要因为一个缺点就全盘否定一个人。 8. **自我反思与觉察:** 在判断他人时,也要反观自己是否带有偏见、投射或情绪滤镜。 你的观察也可能反映了你自身的状态。 **看透人性是给人贴标签,而是理解行为背后的动机;是寻找完美之人,而是识别值得托付的真心。 ** 你的总结是一份精炼的生存指南,而真正的人性理解需要我们既保持清醒的判断力,又怀有悲悯的同理心。 在复杂的人际关系中,这份清醒让你少走弯路,而那份悲悯则让你在纷繁世相中保持温暖与尊严。
09-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值