单一职责原则(Single responsibility principle,SRP)是一个简单而直观的原则,但却是SOLID五大原则中最容易被误解的,也是经常违反的一个原则。可能是由于名字的原因,程序员们会想当然的认为这个原则就是指:每个模块都应该只负责一件事,也就是一个类或者模块只负责完成一个职责。我们要设计粒度小,功能单一的类。毕竟要”高内聚、低耦合”嘛!在重构中,我们也确实一致在强调每个函数值完成一个功能,但是这个方面并不是SRP的全部。
Robert C Martin(Bob大叔) 在他的著作 《敏捷软件开发:原则、实践与模式》 中初次将其定义为
一个模块应该有且仅有一个变化的原因 A class should have only one reason to change.
而20年后,在他的新书 《架构整洁之道》中,其定义变成了
一个模块应该对一类且仅对一类行为者(actor)负责
SOLID原则是一套比较成体系的设计原则。它不仅可以指导我们设计模块,有效帮助我们设计出易维护,好理解且灵活可扩展的软件,也可以减少软件的复杂性。当你在开发新功能时,不至于牵一发而动全身。在软件维护中,也不至于战战兢兢,因为你不会在担心一个改动会影响到其他组件。
它实际上是五个设计原则首字母的缩写,分别是:
团队中,代码规范是一件很重要的约定,每一个人都应该去遵守,这样才可以写出大家都容易读懂的代码。本文列出了常用的代码标准规范与约定。 主要涵盖:
实现Dispose方法其实主要是用来释放非托管资源(unmanaged resource
)。而一个类型中如果有嵌套有另一个实现IDisposable
接口的实例成员时,通常会级联调用Dispose
方法。当然一个类中如果只使用了托管资源,也是可以实现Dispose方法去尽早释放资源从而释放已经分配的内存,比如清空一个List,Dictionary等。
针对非托管资源,GC并不负责释放,那么有两个途径可以释放它们:
字符串拼接是一个非常常见的需求,目前C#中也是支持多种方式进行字符串拼接。
常见的方式有:
那么到底应该采用何种方式最佳呢?
C#中类型主要分为引用类型和值类型,通常情况下值类型分配在堆栈(Stack)上,而引用类型则分配在托管堆(Heap)上。
下图列出了C#中的值类型和引用类型。如果想知道一个变量是值类型还是引用类型,可以采用variable.GetType().IsValueType
去检测。
下图列出了C#中的核心值类型和引用类型:
.NET CLR 管理了应用程序占用内存的分配和释放,开发人员在开发托管的应用程序是就不用在开发代码去管理内存了。针对内存的管理依赖于垃圾回收机制(Garbage Collection),分为 标记(Full Mark
) -> 回收(Sweep
) -> 压缩(Compact
)三个阶段,不在使用引用计数的方式了,类似采用GC机制的还有像Java,Node JS, Go 等编程语言。
当你的对象中的一个属性(Property
)是一个接口,这个接口有几个实现的具体类时,如果采用 JSON.NET 进行简单快速的序列化和反序列化呢?
比如这个例子,一个 Message
, 他的 Header
是一个接口,同时 Message
自己也是一个抽象类,它有两个子类分别是 HttpMessage
和 RpcMessage
.
C# List 类型默认的初始容量是 4,如果随着元素的增加,List 内存是采用翻倍的方式去增加系统的容量,这样则会导致内存需要进行 Resizing,那么如果可以预期到最大的容量需求,如何避免 Resizing 带来的性能损耗呢?
本文主要涵一下几个方面:
本文介绍了几种如何使用一个SqlCommand执行多条SQL语句的技术。
今天遇到一个要处理XSD中Integer的数值区间的计算的问题,Integer这个类型的值区间理论上是可没有边界的,假设目前的值是1.5E+10000, 这个数字已经达到double和Int64都无法存储了,同时我还要对如此大的数字进行加减运算,后来发现了BigInteger这个类可以很好的解决我遇到的问题。^_^
xml是常用的一种数据文件格式,它的定义文件为Xml schema definition(XSD),那么怎么验证一个xml是否符合它的schema定义呢? 本文给出C#的代码实现。
本文是学习《Python核心编程》的学习笔记,介绍了Python中的全局解释器锁和常用的两个线程模块:thread, threading,并对比他们的优缺点和给出简单的列子。
Python代码的执行都是有Python虚拟机进行控制的。当初设计Python的时候,考虑在主循环中只能有一个控制线程在执行,就像单核CPU进行多线程编程一样。 怎么做到这样控制的呢?就是这里的GIL来控制的,这个锁用来保证同时只有一个线程在运行。
执行方式: Python 3多线程编程学习笔记-基础篇
在看《Python核心编程》第三版 讲述网络编程Socket的知识,在练习中采用Python 3 的代码中遇到一个与编码解码有关的坑,本文将给予详细的介绍。
最近一直在关注Python写爬虫相关的知识,尝试了采用requests + Beautiful Soup来爬取房天下(原搜房网)的推荐新楼盘。
不用不知道,一用发现有惊喜也有惊吓,本文就一同记录下惊喜和踩的一些乱码的坑。