基于C++的纯面向对象的通用高性能大并发TCP-SERVER/CLIENT开发框架实践系列之前言篇

简介:   基于C++的纯面向对象的通用高性能大并发TCP-SERVER/CLIENT开发框架实践系列之前言篇yijian 2008-12-21 technologier@126.com1. 回首工作几年了,没什么沉淀,不是忙工作就是忙着休息,大四和工作的第一年还偶尔在一些技术论坛写写文章,但是这都是N年前的事了,以前经常动手编写小程序的习惯也在三四前中断了。
 

基于C++的纯面向对象的通用高性能大并发TCP-SERVER/CLIENT开发框架实践系列之前言篇<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

yijian 2008-12-21 technologier@126.com

1. 回首

工作几年了,没什么沉淀,不是忙工作就是忙着休息,大四和工作的第一年还偶尔在一些技术论坛写写文章,但是这都是N年前的事了,以前经常动手编写小程序的习惯也在三四前中断了。如今已经是三十而立之人,面对两手空白的现状,难免会有些失落和遗憾。激情好象离我有点儿远了,但随着工作的时间越久,感觉自己有很多的东西需要表达出来,一是为自己做做总结,二是希望一些经验可以和大家一块探讨。对说得不对的地方,请大家多拍拍砖头以协助改正。

2. 关于标题

文章的标题非常长,但也代表了本系列文章的目的:一是要实现一个基于TCP的Server和Client框架;二是框架要求通用;三是要求框架性能高、能够满足大并发环境;三是框架的实现采用C++;四是要采用纯面对象开发,而不仅是一个类的包装。

3. 面向对象

本人是面向对象技术的爱好者,平常和人在这方面交流不多,希望借这个机会结交更多的面向对象爱好者,以提升这方面的能力。

接触面向对象已有几载,虽仍在不断学习当中,但心中有一些感想希望可以和大家一块讨论。采用面向对象的分析和设计,能给我一处非常愉快的感觉。在我看来,面向对象设计就如同摆积木游戏,甚至可以拿来和管理一个公司做对比,其中甚有非常多的相同之处,通过这样的对比,更能快速理解面向对象方法的思想。

4. 设计模式和面向对象

设计模式和面向对象关系密切,各种模式离不开面向对象的特性。很多初接触者都对设计模式抱以非常大的兴趣和热情,但常感觉设计模式较难消化,甚至出现为模式而设计的情况。

模式是经验,面向对象是思想和基本概念,如果对面向对象理解不够,那学习起设计模式估计会遇到较大的阻力。个人感觉,学习设计模式和面向对象方法不如从面向对象的五大基本原则下手,这样能事半功倍,达到磨刀不误砍柴的效果。

5. 三大基本特性

透切理解面向对象三大基本特性是理解面向对象五大基本原则的基础,这三大特性是:

5.1. 封装

这是面向对象第一大特性。不能说用一个类将所有成员包裹起来了就将封装,private/protected/public这三大可见性非常重要,也就是我们不但要封装好,而且要尽可能地使用可见范围小,很多公司都有授权最小化原则,是同一个道理。

5.2. 继承

继承最重要的一个目的是代码重用。

5.3. 多态

在C++中多态分静态和动态两种:静态是指模板,它是编译期的多态;而动态是指虚拟,它是运行期的多态。使用好这个特性对改善性能的结构意义非常重大,同时它也是三大基本特性中最难把握控制好的一个。

6. 五大基本原则

6.1. 单一职责原则SRP(Single Responsibility Principle)

是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。

6.2. 开放封闭原则OCP(Open-Close Principle)

一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。

6.3. 替换原则(the Liskov Substitution Principle LSP)

子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。

6.4. 依赖原则(the Dependency Inversion Principle DIP)

具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类:

 

而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:

 

这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。

通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。

6.5. 接口分离原则(the Interface Segregation Principle ISP)

模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。

7. 系列结构

本系列将由四大部分组成:第一部分是前言篇,第二部分是基础篇,第三部分是服务端篇,第四部分是客户端篇。

7.1. 前言篇

概况性地介绍本系统,及写作出发点和目的,以及系列的内容。

7.2. 基础篇

服务端和客户端框架更底层的通用类设计。由于这部分类间的关系简单,打算描述简单些以节省时间,并不提供实例。

7.3. 服务端篇

专注于服务端的介绍,将包括较为详细的类图和时序图,及部分伪代码,并尽可能地提供一个实例,打算以一个HttpServer为实例,静态页面性能要求高于ngix/lighttp/apache等。

7.4. 客户端篇

专注于客户端的介绍,将包括较为详细的类图和时序图,及部分伪代码,并尽可能地提供一个实例。

8. 写作计划

最近工作是我有生以来最忙的一段时间,连续几个周五晚上都在加班,估计要持续到明年三四月份。所以,只能在周未的时候偷点时间来写,目标是在春节期间完成。

相关文章
|
2月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
168 77
|
2月前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
73 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
2月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
86 19
|
2月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
87 13
|
2月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
63 12
|
2月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
60 10
|
1月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
10天前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
37 16
|
3天前
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。
|
3天前
|
存储 编译器 C++
类和对象(上)(C++)
本篇内容主要讲解了C++中类的相关知识,包括类的定义、实例化及this指针的作用。详细说明了类的定义格式、成员函数默认为inline、访问限定符(public、protected、private)的使用规则,以及class与struct的区别。同时分析了类实例化的概念,对象大小的计算规则和内存对齐原则。最后介绍了this指针的工作机制,解释了成员函数如何通过隐含的this指针区分不同对象的数据。这些知识点帮助我们更好地理解C++中类的封装性和对象的实现原理。

热门文章

最新文章