- 博客(209)
- 资源 (5)
- 收藏
- 关注
原创 我们在开发时,什么时候用到虚函数和纯虚函数?
在曾经学习面向对象的概念上,对虚函数和纯虚函数的区别,我们都会止于这样的理解层面:虚函数是用于被子类可继承可重写的函数,而纯虚函数是子类继承后就必须重写的函数。但是在开发工作上,却有很多开发者是没法彻底参透到其中的代码设计艺术,于是会把代码写得一塌糊涂。面向对象其实是个很好的设计理念,如果能够掌握好如何使用它,那么我们就会把开发的事情做得游刃有余。以下我稍微讲讲它们该如何使用的恰当,才能展现出代码的扩展性和提高代码质量。
2025-03-10 22:25:31
377
原创 关于对接底层库的事情,我想对开发应用端的工程师说些话
一、写作概述最近比较平静,没有太多的思绪,为此不想多说一些话了。记录下这篇文章,完全是临时起意而有所感。我曾做过应用端开发,也做过底层库相关的工作,甚至两者的角色也同时担任过。此篇文章可能会存在一种对底层库的工程师“不太友好”的评价,实际上我也只不过是在调侃工作上的不容易而已,并非针对某一个角色。请勿过多解读。只是这些问题,也的的确确时常存在的。二、对接项目的问题与分析在开发过程中与底层库程序员的对接项目,他们往往做不到“专业”的水准:底层库的接口跟应用不兼容。
2025-01-23 12:42:29
467
原创 来自程序员吃狗屎糖的经验之谈
写作前唠叨一会昨天下班,我刚从公司大门出来,突然感觉自己今天下班好像下早了。因为公司外面还挺热闹,有人摆摊卖小吃,对此我有点不习惯。当然还是要解释一下,公司并没有强制要求加班,只是我几乎每天下班都在办公室里呆得比较晚,直至天黑了才慢悠悠的出来。不过我并不认为自己有多努力,那是因为:有时工作累了,想留下来打几把游戏再回去。也有时因工作遇到技术难点,我不得不抽点时间去学习和查缺补漏。由于下班的挺早,太阳尽管很热,我的内心仍就感到舒坦。自己从兜里拿了一块同事给的狗屎糖,细嚼慢咽,品尝着“狗屎样”的甜味。
2024-08-17 21:54:28
719
原创 设计模式(三)-结构型模式(6)-享元模式
享元对象是有了,但是我们编程中,起码也要保证唯一标识的半径值,是不能因为程序的变化而变化吧,即对象的外部不能对半径进行修改。这时候就有了外部状态和内部状态的区别。
2023-12-22 16:01:10
1324
原创 设计模式(三)-结构型模式(5)-外观模式
然后每个子系统所实现的功能,就由一个称为外观的高层功能模块来调用。该模式在开发时常常被使用过,所以很容易理解,就不多说了。某个功能模块存在多个子系统时,每个子系统实现各自的子任务,并且将它们组合在一起来完成一个完整的任务。实现一个登录帐户的功能,登录分为验证码验证、连接服务器、从数据库匹配帐户和密码的三个主要步骤。SubSystem(子系统类):实现子系统的功能。可以被外观类调用,也可以直接被客户端调用。Facade(外观类):为子任务提供一个共同对外的高层接口。在客户端调用它的方法。
2023-12-19 22:06:14
1002
原创 设计模式(三)-结构型模式(4)-组合模式
比如在文件管理系统中,所有文件和文件夹形成树状结构,文件夹目录里存在子文件夹和文件。枝结点有下一个层级,所以可以对其子结点的对象进行移除或增加新对象的操作。组合对象的抽象接口(Component):定义组合对象的公共接口。(组合对象指的是所有结点。枝结点具体类(Composite):枝节点实现组合对象的抽象方法,并且有一个容器用来存储子结点。在代码设计中,有种情况是对象之间存在层次关系,即对象之间会存在父结点和子结点的关系。叶结点具体类(Leaf):叶结点实现组合对象的抽象方法,但没有子结点。
2023-12-19 12:45:08
771
原创 设计模式(三)-结构型模式(3)-装饰模式
用户可勾选使用特效功能,弹出时会有抖动的效果。(这里的用户可分为使用红包的用户,和调用红包生成器底层库接口的程序员)2、
2023-12-18 13:54:51
1109
原创 设计模式(三)-结构型模式(2)-桥接模式
根据设计原则中的单一职责原则:各自模块应当保持各自的分工任务。比如在画图系统中存在形状和画笔的两个维度。形状负责的是它的模样(矩形、圆形、三角形等),而画笔负责的是铅笔、毛笔、圆珠笔之类的选型。
2023-12-14 13:07:20
1035
原创 设计模式(三)-结构型模式(1)-适配器模式
在软件设计中,某个模块里有很多公用的功能接口,其中有些公用接口需要用到不同的类当中时,会出现接口不兼容的问题。因为这些不同的类对这个相同任务的接口,都有各自代码逻辑的要求。比如在文件操作的模块中,都有获取文件属性、读写文件操作等共同的功能接口。这就出现了一个问题:保存 txt 文件和保存图片虽然都是保存操作的任务,但是实现的代码逻辑并不相同。在迭代版本中,客户希望在保存文本文件功能的基础上,还想要增加对一个图片文件进行保存的功能。将一个类的接口转换成客户希望的另外一个接口,以解决接口不兼容的问题。
2023-12-13 11:14:00
1528
原创 设计模式(二)-创建者模式(5)-建造者模式
(为了方便理解,下面例子不写得过于复杂,就不使用 Graphics 和 Pen 的复杂方式绘图,而使用 Point 数组进行简单绘图)为了要使得复杂对象里的各个部分的独立性,以及将它们组合在一起的算法需要保持固定(不会轻易改变其算法逻辑),不会随着新需求改变从而改变原有的逻辑。此时就需要用建造者模式了。在软件系统中,会存在一个复杂的对象,复杂在于该对象包含了很多不同的功能模块。该对象里的各个部分都是按照一定的算法组合起来的。将一个复杂对象的构建和其各个部分之间分离,在同一个算法组合里可以创建出不同的对象。
2023-12-11 22:33:23
794
原创 C# Bin、XML、Json的序列化和反序列化
需要一个程序包,在程序包管理控制台里输入安装命令:Install-Package Newtonsoft.Json。2)bin 文件的序列化和反序列化。4)Json 的序列化和反序列化。3)XML 的序列化和反序列化。5)序列化转换的模板。
2023-12-02 22:45:52
902
原创 设计模式(二)-创建者模式(3)-抽象工厂模式
如果我们知道把所有产品(比如车)分为几个产品族(比如自行车族、汽车族),那么工厂子类就对应指定的产品族进行“批量”创建对象。在工厂模式中,我们需要定义多个继承于共同工厂抽象基类的工厂子类,这些子类负责创建一个对应的对象。不需要每次定义一个新的产品类时,就要扩展新的工厂子类。工厂子类提供一个产品族中多个对象的创建工作,客户端可以方便使用某个产品族中的对象。要增加一个新系列的某一产品,要定义产品抽象类、产品实现类,工厂抽象基类,工厂子类。继承某系列抽象基类,用以实现某系列里某产品的特征和行为的具体类。
2023-11-20 14:00:12
511
原创 设计模式(二)-创建者模式(2)-工厂模式
由于简单工厂模式存在一个缺点,如果工厂类创建的对象过多,使得代码变得越来越臃肿。这样导致工厂类难以扩展新实例,以及难以维护代码逻辑。于是在简单工厂模式的基础上,对工厂类进一步优化。解决了工厂类难以扩展和难以维护的问题。如果想要怎么样的的实例,就要扩展一个其对应的工厂子类就可以了。定义一个工厂抽象基类,让其子类自己决定实例化哪一个工厂类。每次扩展新的工厂子类,就会增加系统的复杂度。继承抽象基类,用以实现特征和行为的具体类。用以定义特征和行为的抽象接口。对对应的实现类进行实例化。提供一辆汽车和一辆自行车。
2023-11-19 17:28:51
417
1
原创 设计模式(二)-创建者模式(2-0)-简单工厂模式
客户端不需要关注创建实例的过程。于是需要通过工厂模式,要把创建对象过程和使用对象进行分离。所以客户端只要使用对象即可,而创建对象过程由一种类来负责,该类称为工厂类。由于创建实例的方式是在静态方法里实现的,所以简单工厂模式也称为静态工厂方法模式。创建一个工厂类,根据不同的参数来创建不同类的对象,并把该对象返回给共同的一个基类。创建对象时,客户端不需要处理整个创建逻辑的过程。只要输入参数就可生成对应的对象。1)如果工厂类存在代码逻辑的错误,一经修改后,整个系统都要受到影响。
2023-11-19 16:46:23
355
原创 设计模式(二)-创建者模式(1)-单例模式
在程序运行当中,我们只希望一个类只能创建一个对象,在多个地方可以公用这个唯一的对象。必须保证类只能创建一个对象。
2023-11-19 12:57:54
613
原创 SQL必知会(二)-SQL查询篇(11)-联结表
联结表SELECT 表1列, 表2列...FROM 表1, 表2...WHERE 有共同列名的过滤条件;另外语法:SELECT 表1列, 表2列...FROM 表1INNER JOIN 表2.. ON有共同列名的过滤条件;联结表的性能联结的每一张表,都需要耗费相应的资源。联结的表越多,性能就越下降。
2023-11-18 17:17:01
350
原创 设计模式(一)-设计原则(1)
但是 A 的部分成员都设置为私有,不能访问 A 类 的私有成员, B 类只能访问 A类的公有成员。而如果实例化一个动物鱼,则鱼不符合飞的行为特征,也就不满足统一性。在类里面,不仅要实现文件的下载上传,还对文件进行读写的功能等。比如模块 A 和模块 B 互相依赖,模块C和B互相依赖,而 C 跟 A 没有关系。根据以上ABC类描述的,数据分析师类作为 C 类,数据管理员类作为 B 类,顾客类作为 A 类。减少模块间的依赖,降低模块间的耦合性。A类依赖B类,当B类修改或消失时,对A类会影响很大。
2023-11-17 00:41:53
599
原创 C# 实现动态数组
(八)CSharp-泛型类和参数约束(1)_csharp 泛型-优快云博客set;}//容器大小} }// 参考 List 容器,创建后,arry 默认为 new arr[1];在外部用来遍历数组元素的,即foreach(var item in list)。(九)枚举器和迭代器(2)_enumerator 迭代器-优快云博客//枚举器后面就编写实现对数组操作的函数,如Add,Remove等。
2023-11-14 12:54:07
697
原创 SQL必知会(二)-SQL查询篇(10)-使用子查询
子查询的单列子查询只能返回某一个列,不能是多个列。所以子查询 SELECT 语句只能查询单个列。SELECTgroup by cust_id --由于是分组,会返回多个值-- 错误,SELECT 一次返回的列值,不能是多个值。子查询使用的列SELECT 列1,FROM 表1WHERE 某列[或表1.某列] = 表2.某列FROM 表2;
2023-11-14 09:27:27
312
原创 SQL必知会(二)-SQL查询篇(9)-分组数据
GROUP BY:分组SELECT ... 聚集函数FROM 表GROUP BY 列;-- 错误语法:SELECT 列, 聚集函数FROM 表;(若出现SELECT 列 ,则要与 GROUP BY 列 搭配使用)HAVING:过滤分组SELECT ...聚集函数FROM 表GROUP BY 列HAVING 过滤条件;-- 1.先分组:GROUP BY 列-- 2.后过滤分组:HAVING 过滤条件对行进行过滤: WHERE对行的某些字段进行分组: GROUP BY。
2023-11-14 09:26:46
230
原创 SQL必知会(二)-SQL查询篇(8)-汇总数据
对某列的多行数值进行汇总,比如求某列中所有行的值之间得出的平均值,总和,最大小值等。MIN()、SUM 跟 MAX 用法差不多,就不再做这个笔记了。MAX 函数返回指定列的最大值,忽略掉列值为 NULL 的行。4)DISTINCT 不能用于 COUNT(通配符)对表中行的数目进行计数,列中包括非空值和空值。AVG 函数只能用来确定特定数值列的平均值。组合多个聚集函数一起执行。2)COUNT() 函数。1)AVG() 函数。3)MAX() 函数。
2023-11-14 09:24:22
654
原创 SQL必知会(二)-SQL查询篇(7)-使用函数处理数据
使用 SOUNDEX() 函数:用来匹配与输入的文本有发音相似的文本串。(匹配文本的要素:发音字符和音节)因为有些数据库使用 SQL 函数有差异,所以难以对 SQL 进行移植。1.2)文本处理函数: SOUNDEX() 函数。UPPER() 函数:将文本转换为大写。2)日期和时间处理函数。
2023-11-11 18:11:42
199
原创 SQL必知会(二)-SQL查询篇(6)-创建计算字段
拼接字段-- 列1+列2+其他字符串=拼接后的一列字符串SELECT 列1 + '(' + 列2 + ')'FROM 表;-- RTRIM() 去掉字符串右边的空格SELECT RTRIM(列1 + '(' + 列2 + ')'FROM 表;AS:给某列名称起另外一个名称。SELECT 列AS 新列名FROM 表;对检索的数据进行算术计算SELECT 列1,列2..,列与列之间的计算方程FROM 表;
2023-11-11 18:11:21
290
原创 SQL必知会(二)-SQL查询篇(5)-用通配符进行过滤
LIKE:匹配文本SELECT 列1, 列2FROM 表WHERE 列3 LIKE '内容+通配符';注意 NULL:通配符不匹配列值为 NULL 的行。
2023-11-11 18:10:56
305
1
原创 SQL必知会(二)-SQL查询篇(4)-高级过滤
AND OR:与条件、或条件WHERE 条件1 AND 条件2;WHERE 条件1 OR 条件2;//AND OR 同时使用,注意关键字的优先级:WHERE (条件1 OR 条件2) AND 条件3;IN:条件范围WHERE vend_id IN ('列值1','列值2')NOT:非条件WHERE NOT 条件1。
2023-11-11 18:09:46
217
原创 SQL必知会(二)-SQL查询篇(2)-排序检索数据
OEDER BY:排序SELECT 列FROM 表ORDER BY 列;SELECT 列1,列2,列3FROM 表ORDER BY 列2,列3;-- 先按列2值升序排序,再根据列2相同值里的项,按列3升序排序SELECT 列1,列2,列3FROM 表-- 2 和 3 代表的是 SELECT 中的列2和列3-- 也就是ORDER BY 设置数字范围在1~3(SELECT 枚举的列数),超出该范围的值会提示语法错误。细节区别:ORDER BY 列2,列3;
2023-11-08 18:15:51
202
原创 SQL必知会(二)-SQL查询篇(1)-检索数据
SELECT:查询SELECT 列FROM 表DISTINCT:过滤掉多余的重复记录只保留一条SELECT DISTINCT 列From 表;TOP:限制最多返回多少行SELECT TOP 行数 列FROM 表;
2023-11-08 18:09:03
768
原创 SQL必知会(一)-学习前的准备
本文作为首篇文章,主要内容是为学习《SQL 必知会》之前做些准备的。下文是本书中每个章节提到的例子《玩具经销商订单系统》,学习者在学习之前需要创建相关的数据库信息。比如我在计算机里安装了 Miscrosoft SQL Server 2014。创建数据库(不创建数据库也行,直接创建的表会默认放在系统数据库 master 里 )创建数据库中的表设置表与表之间的关系(外键主键等)在每张表中添加数据。
2023-11-07 16:06:01
686
原创 修复VS2015没有代码提示的问题【已解决】
(不必要时,要慎用该方法,该方法会把项目历史记录都清除掉,社区版还要重新登陆账号才能使用)安装辅助工具 Visual Assist,发现需要注册或者免费试用要填写信息才能使用(记得这个工具以前是完全免费的),因为不想交钱就卸载了。此刻懂了VS 缺少了代码提示的组件。安装了“Microsoft SQL Server Compact)4.0 ”,应该我之前在重新安装数据库时,把这个卸载掉了。在Visual Studio 中编写代码时,发现使用库函数的时候,在类对象后输入点后,并没有出现类对应的成员信息的提示。
2023-10-27 18:36:47
2378
原创 (一)CSharp-Socket
可以使用 Shutdown() 方法来禁止该套接字上的发送和接收,Shutdown() 方法有一个枚举类型的参数,如 SocketShutdown.Send 表示禁用发送套接字,SocketShutdown.Receive 表示禁用接收套接字,SocketShutdown.Both 表示禁用发送和接收的套接字。通信的异步,指客户端在发送请求后,不必等待服务端的回应就可以发送下一个请求,这样对于所有的请求动作来说将会在服务端得到异步,这条请求的链路就像是一个请求队列,所有的动作在这里不会得到同步。
2023-06-26 12:00:55
880
3
原创 (一)CSharp-多线程编程
使用到 lock (this)、Monitor.Wait(this)、Monitor.PulseAll(this)、Thread.CurrentThread.Abort()
2023-06-26 11:59:49
1076
原创 (一)CSharp-网络编程
Dns 类是一个静态类,它提供了有关域名解析的操作,它将从网路主机域名系统中获取 IP 地址和主机名、WWW 域名的对应关系。为 Internet 主机地址信息提供容器的累,它将 DNS 主机名与一个别名数组和匹配的 IP 地址数组相关。该类中包含应用程序连接到主机服务时需要的主机和端口信息,通过组合主机的 IP 地址和端口号构成服务的一个连接点。主机地址分为若干个子网,分为子网地址和主机地址。,为两个端系统(也就是源站和目的站)的会话层之间,提供建立、维护和取消传输连接的功能,并负责可靠地传输数据。
2023-06-26 11:57:44
2605
原创 (六)WPF - 资源和样式行为(1)
否则,如果使用静态资源,将仍然使用原来的颜色方案,直到用户重新启动应用程序为止。使用动态资源可以改善加载时间,对静态资源的引用总是发生在 Window 或 Page 加载之后,而对动态资源的引用要到实际使用时才会生效。每个元素都有自己的资源集合,并且为了找到期望的资源, WPF 在元素树中进行递归搜索。为了使用 XML 标记中的资源,需要一种引用资源的方法。动态资源只能用于设置依赖属性值,而静态资源可以在任何地方使用。使用静态资源时,必须总是在引用资源之前在标记中定义资源。动态资源需要占用更多的资源。
2023-06-23 19:58:07
1522
1
原创 (五)WPF - 依赖属性
第一步是定义表示属性的对象,它是 DependencyProperty 类的实例。属性信息应该始终保持可用,甚至可能需要在多个类之间共享这些信息。因此,必须将 DependencyProperty 对象定义为与其相关联的类的静态字段。字段的定义使用了 readonly 关键字,这意味着只能在 FrameworkElement 类的静态构造函数中对其进行设置。
2023-06-23 19:57:31
1379
原创 (四)WPF - 布局
FlowDirection 是 FrameworkElement (以及其他一些类)的属性,它可以改变元素的内部流的方向。RenderTransform(继承自 UIElement),它在布局结束后被应用(但在元素被渲染前)。LayoutTransform 没有原点的概念,因为被变换元素的定位是由父面板规则完全控制的。DockPanel 提供停靠支持,该容器中的子元素可以使用Dock属性来设置要停靠的容器边缘。用来处理面板子元素的布局问题,但它也可以应用于 那些内容在子控件中对齐的情况。
2023-06-23 19:57:00
958
原创 (二)WPF - 应用程序
从 Application 对象的构造器中初始化应用程序,或者处理 Startup 事件通常更好,因为 Application 在这里才完成它的内部初始化(例如,Application.Current 不会在构造器中进行设置)。在 WPF 中传递数据的一个简单的方式就是利用 Application 的 Properties 字典。:当系统运行于低内存的时候,如此少的可用资源以至于 CLR 都不能多分配一个字节了。在这样的情况下,没有任何代码能被即时编译,没有任何变量能被装箱,也没有任何对象能被分配。
2023-06-23 19:50:37
1265
mfc按钮类,1张图片合成3种状态
2017-06-16
MFC自绘按钮类,点击、悬浮,初始状态
2017-06-16
Myeclipse 10.6 (支持所有10版本)破解文件+破解说明。
2017-01-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人