面向对象软件设计原则(一) —— 引子

“面向对象软件设计”这个术语及其相关话题对于很多开发人员来说已经是耳熟能详了,甚至听腻了。但是,对不住各位,为了吸引眼球和引起“异性” 注意,本座还是落入俗套选择这个热门话题作为本博客的开张炒作篇目。请见谅,也希望各位看官能放下架子,略读一下本系列的所有文章再喷,可赞可弹可BS, 但勿吐槽,毕竟不想因为本座的文字噪音降低看官的SZ,伤不起呀!!

  言归正传,在如何阐述“面向对象软件设计”这个问题上,本座琢磨了良久,毕竟命题宽泛,表达方式和层次多样。最终决定用相对通俗,以本座的读书和工作经历,在中等层次上进行阐述。

  本座从十年多前走出校门之时就确信软件架构(设计)、数据结构和算法是软件的根本核心,也是衡量个人技术水平的终极标准。因此,从一开始本座就特别关注软件设计方面的知识,本座读过的三本书恰巧体现了软件设计开发的几个方面:

  • 编程开发:《Design Patterns Elements of Reusable Object-Oriented Software》
  • 软件设计:《Agile Software Development: Principles, Patterns, and Practices》
  • 系统架构:《Pattern-Oriented Software Architecture》

    若从编程开发的层次谈软件设计不够全面,有只见树木不见森林之嫌;而从系统架构的层次去谈则显得过于专业,受众不多,会失去大部分读者。因此本系列文 章通过本座多年前阅读:《Agile Software Development》的笔记整理和心得体会来阐述面向对象软件设计原则。

  最后,本座要表达一个重要的观点:任何知识的学习过程都要经历“守”(依葫芦画瓢,获得感觉)、“破”(掌握规律,懂得比较、选择)、“离”(突破条框,自成一派,无招胜有招)三个阶段,在学习的过程中不要墨守成规,需要结合实际情况不断思考和提炼知识,突破自己。

  • 自信来源于哪里?来源于掌握足够多的知识。
  • 求知欲望来源于哪里?来源于未掌握的知识。知识就像一个圆圈,掌握知识越多圆圈越大,圆圈越大则圈外的世界也越大。

  下一章:面向对象软件设计原则(二) —— 软件设计的腐化

02 2012 档案

面向对象软件设计原则(二) —— 软件设计的腐化
摘要: 我们如何知道软件设计的优劣呢?以下是一些拙劣设计的症状,当软件出现下面任何一种气味时,就表明软件正在腐化。僵化性(Rigidity):很难对系统进行改动,因为每个改动都会迫使许多对系统其他部分的其他改动。脆弱性(Fragility):对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题。牢固性(Immobility):很难解开系统的纠结,使之成为一些可在其他系统中重用的组件。粘滞性(Viscosity):做正确的事情比做错误的事情要困难。不必要的复杂性(Needless Complexity):设计中包含有不具任何直接好处的基础结构。不必要的重复(Needless Repet..阅读全文

posted @ 2012-02-27 00:26 ~怪^_*兽~ 阅读(365) | 评论 (5) 编辑

面向对象软件设计原则(一) —— 引子
摘要: “面向对象软件设计”这个术语及其相关话题对于很多开发人员来说已经是耳熟能详了,甚至听腻了。但是,对不住各位,为了吸引眼球和引起“异性” 注意,本座还是落入俗套选择这个热门话题作为本博客的开张炒作篇目。请见谅,也希望各位看官能放下架子,略读一下本系列的所有文章再喷,可赞可弹可BS, 但勿吐槽,毕竟不想因为本座的文字噪音降低看官的SZ,伤不起呀!! 言归正传,在如何阐述“面向对象软件设计”这个问题上,本座琢磨了良久,毕竟命题宽泛,表达方式和层次多样。最终决定用相对通俗,以本座的读书和工作经历,在中等层次上进行阐述。 本座从十年多前走出校门之时就确信软件架构(设计)、数据结构和算法是软件的根...阅读全文

posted @ 2012-02-26 20:00 ~怪^_*兽~ 阅读(576) | 评论 (0) 编辑

基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计与实现
摘要: 设计概述 服务端通信组件的设计是一项非常严谨的工作,其中性能、伸缩性和稳定性是必须考虑的硬性质量指标,若要把组件设计为通用组件提供给多种已知或未知的上层应用使用,则设计的难度更会大大增加,通用性、可用性和灵活性必须考虑在内。 现以一个基于 IOCP 的通用异步 Windows Socket TCP 服务端组件为例子,讲述其设计与实现相关的问题,希望能引发大家的思考,对大家日后开展相关类似工作时有所帮助。关于通用性、可用性、Socket 模型选型以及接口模型的设计等问题已经在本座前段时间发表的《通用异步 Windows Socket TCP 客户端组件的设计与实现》中进行过阐述,此处就不再重..阅读全文

posted @ 2012-02-26 00:18 ~怪^_*兽~ 阅读(1003) | 评论 (10) 编辑

通用 Java 文件上传和下载组件的设计与实现
摘要: 概 述 文件上传和下载是 Web 应用中的一个常见功能,相信各位或多或少都曾写过这方面相关的代码。但本座看过不少人在实现上传或下载功能时总是不知不觉间与程序的业务逻辑纠缠在一起,因此,当其他地方要用到这些功能时则无可避免地 Copy / Pase,然后再进行修改。这样丑陋不堪的做法导致非常容易出错不说,更大的问题是严重浪费时间不断做重复类似的工作,这是本座绝不能容忍的。哎,人生苦短啊,浪费时间在这些重复工作身上实在是不值得,何不把这些时间省出来打几盘罗马或者踢一场球?为此,本座利用一些闲暇之时光编写了一个通用的文件上传和文件下载组件,实现方法纯粹是基于 JSP,没有太高的技术难度,总之老少咸.阅读全文

posted @ 2012-02-23 22:26 ~怪^_*兽~ 阅读(781) | 评论 (4) 编辑

Xcode 4.3 免证书(iDP)开发+真机调试
摘要: 网上一直没找到 Xcode 4.3 的免证书开发 + 真机调试的配置方法。因此,本座尝试用 Xcode 4.2 的老方法进行尝试,结果令人欣喜,方法依然奏效,具体方法可参考:《Xcode 4.1/4.2/4.2.1 免证书(iDP)开发+真机调试+生成IPA全攻略》。 注意:和 Xcode 4.2 的配置方法完全一样,但以前版本的 Xcode 根目录为:/Developer,Xcode 4.3 开始以一个独立的 App 发布,因此它的根目录为:/Applications/Xcode.app/Contents/Developer。配置时把所有相关目录替换即可。阅读全文

posted @ 2012-02-20 21:42 ~怪^_*兽~ 阅读(324) | 评论 (2) 编辑

如何养成良好的 C++ 编程习惯(一)—— 内存管理
摘要: “养成良好的编程习惯”其实是相当综合的一个命题,可以从多个角度、维度和层次进行论述和评判。如代码的风格、效率和可读性;模块设计的灵活性、可扩展性和耦合度等等。要试图把所有方面都阐述清楚必须花很多的精力,而且也不一定能阐述得全面。因此,本系列文章以软件开发的基础问题为切入点,阐述程序设计和代码编写方面的细节问题,以点带面,旨在激发大家的思考与总结,希望能为大家带来实际的帮助。 虽然本系列文章定位为科普读物,但本座相信它们不但适合新手们学习借鉴,同时也能引发老鸟们的反思与共鸣。欢迎大家提出宝贵的意见和反馈,觉得写得还可以就“荐”一下吧 ^_^阅读全文

posted @ 2012-02-18 07:27 ~怪^_*兽~ 阅读(2448) | 评论 (15) 编辑

深度剖析:Java POJO Bean 对象与 Web Form 表单的自动装配
摘要: 时下很多 Web 框架 都实现了 Form 表单域与 Java 对象属性的自动装配功能,该功能确实非常有用,试想如果没这功能则势必到处冲积着 request.getParameter() 系列方法与类型转换方法的调用。重复代码量大,容易出错,同时又不美观,影响市容。 现在的问题是,这些框架通过什么方法实现自动装配的?如果不用这些框架我们自己如何去实现呢?尤其对于那些纯 JSP/Servlet 应用,要是拥有自动装配功能该多好啊!本座深知各位之期盼,决定把自动装配的原理和实现方法娓娓道来。 实现原理其实比较简单,主要由以下3个步骤构成:通过 request.getParameterMap...阅读全文

posted @ 2012-02-16 12:12 ~怪^_*兽~ 阅读(865) | 评论 (6) 编辑

通用异步 Windows Socket TCP 客户端组件的设计与实现
摘要: 编写 Windows Socket TCP 客户端其实并不困难,Windows 提供了6种I/O 通信模型供大家选择。但本座看过很多客户端程序都把 Socket 通信和业务逻辑混在一起,剪不断理还乱。每个程序都 Copy / Parse 类似的代码再进行修改,实在有点情何以堪。因此本座利用一些闲暇时光写了一个基于 IOCP 的通用异步 Windows Socket TCP高性能服务端组件和一个通用异步 Windows Socket TCP 客户端组件供各位看官参详参详,希望能激发下大家的灵感。本篇文章讲述客户端组件。闲话少说,我们现在步入正题。最重要的第一个问题:如何才能达到通用? 答:...阅读全文

posted @ 2012-02-15 01:26 ~怪^_*兽~ 阅读(1462) | 评论 (16) 编辑

Linux 安装 MySQL / MySQL 主从备份
摘要: !! 假定所有安装包均在 /share目录,安装目录为 /opt !!$ ll /share-rw-r--r-- 1 root root 129041873 Nov 29 21:06 mysql-5.1.54-linux-i686-glibc23.tar.gz======================================================================================= 安装 MySQL =========================================================================阅读全文

posted @ 2012-02-14 11:31 ~怪^_*兽~ 阅读(1059) | 评论 (2) 编辑

实现 Win32 程序的消息映射宏(类似 MFC )
摘要: 对于消息映射宏,不用多说了,用过 MFC 的人都很清楚。但目前有不少程序由于各种原因并没有使用 MFC,所以本帖讨论一下如何在 Win32 程序中实现类似MFC的消息映射宏。其实 Windows 的头文件 “WindowsX.h”(注意:不是“Windows.h”) 中提供了一些有用的宏来帮助我们实现消息映射。本座是也基于这个头文件实现消息映射,首先看看宏定义文件:#pragma once#include <windowsx.h>/************************************************************************//* 阅读全文

posted @ 2012-02-13 02:42 ~怪^_*兽~ 阅读(1050) | 评论 (0) 编辑

用宏实现 C++ Singleton 模式
摘要: Singleton 设计模式应用非常广泛,实现起来也很简单,无非是私有化若干个构造函数,“operator =” 操作符,以及提供一个静态的创建和销毁方法。但是对每个类都写这些雷同的代码是本座不能容忍的,因此,本座使用宏把整个 Singleton 模式封装起来,无论是类的定义还是类的使用的极其简单,请看代码:/******************************************************************************Module: Singleton.hNotices: Copyright (c) 2006 Bruce LiangPurpo...阅读全文

posted @ 2012-02-12 22:14 ~怪^_*兽~ 阅读(838) | 评论 (18) 编辑

C++ 封装私有堆(Private Heap)
摘要: Private Heap 是 Windows 提供的一种内存内存机制,对于那些需要频繁分配和释放动态内存的应用程序来说,Private Heap 是提高应用程序性能的一大法宝,使用它能降低 new / malloc 的调用排队竞争以及内存空洞。Private Heap 的原理及应用的资料很多,这里就不一一介绍了,常用的 Private Heap API 有以下几个,具体介绍请参考帮助文档:HeapCreate();HeapDestroy();HeapAlloc();HeapReAlloc();HeapSize();HeapFree();HeapCompact(); 由于是 C 风格的...阅读全文

posted @ 2012-02-12 20:39 ~怪^_*兽~ 阅读(183) | 评论 (0) 编辑

基于 crt debug 实现的 Windows 程序内存泄漏检测工具
摘要: Windows 程序内存泄漏检测是一项十分重要的工作,基于 GUI 的应用程序通常在调试结束时也有内存泄漏报告,但这个报告的信息不全面,不能定位到产生泄漏的具体行号。其实自己实现一个内存泄漏检测工具是一件非常简单的事情,但看过网上写的很多例子,普遍存在两种问题:要么考虑不周全,一种环境下能用,而在另外一种环境下却不能很好工作,或者漏洞报告的输出方式不合理。要么过于保守,例如:完全没有必要在 _malloc_dbg() 和 _free_dbg() 的调用前后用 CriticalSection 进行保护(跟踪一下多线程环境下 new 和 malloc 的代码就会明白)。 内存检测主要用到以下...阅读全文

posted @ 2012-02-12 18:35 ~怪^_*兽~ 阅读(1092) | 评论 (0) 编辑

用 Java 实现的日志切割清理工具
摘要: 对于服务器的日常维护来说,日志清理是非常重要的事情,如果残留日志过多则严重浪费磁盘空间同时影响服务的性能。如果用手工方式进行清理,会花费太多时间,并且很多时候难以满足实际要求。例如:如何在每个星期六凌晨3点把超过2G大的日志文件进行切割,保留最新的100M日志记录? 网上没有发觉能满足本座要求的日志切割工具,因此花了一些闲暇时间自己写了一个。由于要在多个平台上使用,为了方便采用 Java 实现。本工具命名为 LogCutter,主要有以下特点:支持 Linux、Mac 和 Windows 等所有常见操作系统平台支持命令行交互式运行支持后台非交互式运行(Linux/MAC 下使用 daem...阅读全文

posted @ 2012-02-12 06:40 ~怪^_*兽~ 阅读(1203) | 评论 (7) 编辑

实验证明:Objective-C++ 完美支持 ARC
摘要: 从 XCode 4.2 开始 Objective-C 支持 ARC,对于广大 iPone 开发者来说是巨大的福音,不用面对满屏 [obj release] 和 [pool drain] 这类丑陋不堪的代码了,更重要的是不用整天为对象释放问题搞得寝食难安。但对于许多从 C++ 转到 ObjC 的开发者来说,其实更喜欢 Obj-C++ 混编。Cocoa 负责界面展现,C++ 负责业务逻辑实现,组合起来十分完美。 问题是 Obj-C++ 能否完美支持 ARC 呢,特别是把 ObjcC 对象放入 STL 容器的情形下能否正常工作? 恭喜大家,答案是肯定的!测试代码一:#import <vect.阅读全文

posted @ 2012-02-12 02:43 ~怪^_*兽~ 阅读(1329) | 评论 (0) 编辑

原文地址:https://www.cnblogs.com/Leo_wl/p/2369378.html