非议MFC(三)库代码的质量问题 (转)

本文深入探讨MFC库代码中存在的六大问题,包括效率、安全性和可靠性等方面,并提供了改进意见。通过对具体函数实现的分析,指出MFC在设计时存在的不足。
非议MFC(三)库代码的质量问题 (转)[@more@]

  非议MFC(三)库代码的质量问题

关键字:C++,MFC,RECT,CRect,POINT,CPoint,质量

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

每个人的代码都不可能完全排除质量隐患,但MFC作为库代码,对其质量怎么苛求都不会过分。

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
{
  CPoint& TopLeft();
  CPoint& BottomRight();
};
file://in
_AFXWIN_INLINE CPoint& CRect::TopLeft()
  { return *((CPoint*)this); }  file://[1]
_AFXWIN_INLINE CPoint& CRect::BottomRight()
  { return *((CPoint*)this+1); }  file://[2]
TopLeft()通过返回CPoint &同时提供Set和Get功能,并且,返回CPoint &比返回CPoint效率高。但是,函数的实现必须依赖指针的跨越性转换(即从CRect *转换成完全不相干的CPoint *),另外,还要假设编译器是顺序存放各数据成员。随意转换指针类型,不安全;依赖编译器实现,不可移植;以后扩展时可维护性降低(如增加数据成员),还有可能导致错误(如引入虚函数时,有的编译器将虚表放在对象存储地址的前部)。

2.不顾效率
file://in
class CRect : public tagRECT
{
  BOOL PtInRect(POINT point) const;
};
因为POINT结构体大于32位地址长度,形参使用值传递效率不高,应该改为引用。
软件的设计应该保持统一的取舍原则,如果说在上一点中,不惜采用那么极端的方式来提高效率,那么这里明显可以合理提高效率的地方为什么要放过呢?

3.算法不严谨
file://in
class CRect : public tagRECT
{
  BOOL IsRectEmpty() const;
};
IsRectEmpty()函数的功能是当矩形面积为空时返回1;当矩形面积为不空时返回0。
给出如下测试代码:
CRect rct(100,100,0,0);
BOOL b=rct.IsRectEmpty();
运行后b的值居然是1!?
有些CRect的成员函数如:IntersectRect()、UnionRect()等只有先调用NormalizeRect()才能确保获得正确结果。但IsRectEmpty()完全没必要依赖NormalizeRect(),例如可以这样实现:
BOOL CRect::IsRectEmpty() const
{
  return (left==right&&up==bottom ? 1 : 0);
}
推测起来,MFC中的实现可能是:若矩形的right<=left或bottom<=up则返回1。

4.无故破坏约定俗成的规则
file://in
class CRect : public tagRECT
{
  void operator=(const RECT& srcRect);
  void operator+=(LPCRECT lpRect);
};
自定义类型不要毫无价值的与内建类型不兼容(《Effective C++》语)。operator=()应该返回CRect &,这样做还可以支持链式赋值。同理operator+=()也应该返回CRect &。

5.没有尽力保证安全性
file://in
class CRect : public tagRECT
{
  CRect operator+(LPCRECT lpRect) const;
};
operator+()应该返回const CRect,这样做可以禁止形如(a+b)=c;的病态语句,同时也保持了与内建类型的行为一致。

6.没有尽力提高可用性和可靠性
file://in
class CDC : public Cobject
{
  BOOL BitBlt(int x, int y, int nWidth, int nHeight, CDC* pSrcDC,
  int xSrc, int ySrc, Dword dwRop);
};
做个简单的类比:
file://in
size_t  __cdecl strlen(const char *);
形参为什么要声明为const char *?因为,其一,const char *既可以接受常量字符串又可以接受非常量字符串,而char *只能接受非常量字符串。其二,const可以保证函数体不更改原字符串这一契约。
所以BitBlt()的声明中,参数pSrcDC是原设备环境,不会改变,应该声明为const CDC *。


请参考上一篇《非议MFC(二)逻辑上的不完备》


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

转载于:http://blog.itpub.net/10752019/viewspace-976581/

>回复要兼顾普适性和深度。 可以分部分:先肯定这份观察的价值,再逐条展开分析背后的心理机制,最后补充观察人性的方法论。 重点要强调"人性复杂"这个核心——这些标签是工具而非绝对标准,避免用户形成非黑即白的认知: ## 🧐 逐条分析行为模式背后的心理 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、付费专栏及课程。

余额充值