读书笔记:《代码大全第2版》 03.创建高质量的代码之创建高质量的类

代码大全学习-8-创建高质量的类 第六章是讲如何创建高质量的类。首先作者介绍了一下抽象数据类型ADT(Abstract Data Type)。一个ADT就是一些数据和对这些数据的操作的一个集合。在面向对象的程序语言中,可以用一个类来实现。当然,类比ADT多一些东西,像继承,多态等。面向对象的语言也会自动支持多个实例,用起来很方便。若是非面向对象的语言,那么实现ADT就要多考虑一下了。若是有多个实例,可能要在ADT的操作中增加一个I 阅读详情

创建高质量的类

成为高效程序员的一个关键就在于,当你开发程序任何一部分代码时,都能安全地忽视程序中尽可能多的其余部分。

1、抽象

类 = ADT(抽象数据类型)+ 继承 + 多态

创建高质量类的最关键一步是创建一个好的接口(这里的接口指的是类中能够被外部访问的方法)。

类的接口应该提供一致的抽象。很多问题都是由于违背该原则而引起的。

一个呈现出很好的抽象的类接口通常也有很高的内聚性。而具有很强内聚性的类往往也会呈现为很好的抽象。

在设计类或类中的方法时,要尽量符合单一职责原则,使其具有高内聚性。

ADT:一些数据以及对这些数据所进行的操作的集合

2、封装

封装的原则:

  • 尽可能的限制类和成员的可访问性(无法确定时,采用最严格的访问级别)
  • 不要公开暴露成员数据(暴露成员数据会破坏封装性,从而限制你对这个抽象的控制能力)
  • 不要对类的使用者做任何假设
  • 让阅读代码比编写代码更方便(如果必须看到底层实现才能理解发生的事情,那还算不上抽象)
  • 类与类之间应该是低耦合的

3、组合(has a)

  • 组合是一个简单概念,表示一个类含有一个基本数据元素或对象
  • 继承比组合更复杂,更容易出错。组合是面向对象的主力技术
  • 要警惕包含有超过5个数据成员(引用对象)或9个数据成员(简单数据类型)的类,可以考虑将其拆分到更小的类中

4、继承(is a)

  • 继承应该遵循 Liskov 替换原则
  • 继承体系不要太深,尽量限制在3层之内
  • 继承会破坏封装性。父类的所有数据应该都是private,子类通过其提供的get/set来访问数据
  • 继承会增加管理复杂度

5、组合与继承的选择

从管理复杂度来说,应该少使用继承,多使用组合。

什么时候可以使用继承,何时又该使用组合:

  • 如果多个类共享数据而非行为,应该创建这些类可以包含的共用对象
  • 如果多个类共享行为而非数据,应该让他们从共同的父类继承而来,并在父类里定义共用的方法
  • 如果多个类机共享数据也共享行为,应该让他们从一个共同的父类继承而来,并在父类里定义共用的数据和方法
  • 当你想由父类控制接口时,使用继承;当你想自己控制接口时,使用组合

6、成员方法和成员数据

有效地实现成员方法和成员数据的建议:

  • 让类中方法的数量尽可能少
  • 减少类所调用的不同方法(来自其他引用类型)的数量
  • 对其他方法的间接调用要尽可能减少(迪米特法则)
  • 一般来说,应尽量减少类和类之间相互合作的范围。尽量减少:
    • 所实例化的对象的种类
    • 在被实例化对象上直接调用 不同方法的数量
    • 调用由其他对象返回的对象的方法的数量

7、构造函数

  • 如果可能,应该在所有的构造函数中初始化所有的数据成员
  • 优先采用深拷贝

8、创建类的理由

  1. 为现实世界中的对象建模
  2. 为抽象的对象建模(比如为Circle、Square抽象出 Shape类)
  3. 降低复杂度
  4. 隔离复杂度
  5. 隐藏实现细节
  6. 限制变动所影响的范围
  7. 隐藏全局数据
  8. 让参数传递更加顺畅
  9. 建立中心控制点
  10. 让代码更易于重用
  11. 预计到某个程序会被修改
  12. 把相关的操作包装到一起(比如工具类)
  13. 实现特定的重构

9、应该避免的类

  • 避免创建万能类
  • 消除无关紧要的类(只包含数据而不包含行为的类)
  • 避免用动词命名的类( 只有行为而没有数据的类往往不是一个真正的类)

10、总结

核对表

《代码大全2》读书笔记 这本书的核心思想是: 管理软件项目的本质是管理复杂性。 代码承载的是人与人之间的交流。 第一部分 打好基础第2章 隐喻重要的研发成果常常产自类比(analogy)。通过把你不太理解的东西和一些你较为理解、且十分类似的东西做比较,你可以对这些不太理解的东西产生深刻的理解。这种使用隐喻的方法叫做“建模”。目前最合适隐喻:建造软件(Building Software)第3章 前期准备( Measure T 阅读详情

相关推荐

《代码大全2》读书笔记:创建高质量的代码 第五章 软件构建中的设计

5.1设计中的挑战 设计师一个险恶的问题  “险恶的”问题就是那种只有通过解决或解决部分才能被明确的问题。这个看似矛盾的定义其实是在暗示说,你必须首先把这个问题“解决”一遍以便能够明确地定义它,然后再次解决该问题,从而形成一个可行的方案。 设计是个了无章法的过程(即使它能得出清爽的结果) 说设计了无章法,是因为在此过程中你会采取很多错误的步骤,多次误入歧途——你会犯很多的错误。事实上,犯错正是...

weixin_42449102的博客 873

如何编写高质量的代码二 - 类的设计

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33923762的博客 135

GEO数据库数据下载方法总结

#GEO数据下载 GEO是生信分析经常用到的数据库。经常需要从中获取表达矩阵,平台信息,meta信息等,本博文总结了几种下载GEO数据的方法,各有优劣,实际应用过程中自行选择适合自己的。 ##方法一:直接从浏览器中下载 以数据集GSE1001为例, 可以直接点击“Series Matrix Files”获取该样本txt格式的表达谱数据,一般我们认为这种处理过的表达谱数据是没有问题的,当然,具体情况具体分析。 打开下载的文件可以看到许多“#”开头的行,这些是注释信息,一般关注这些注释信息中的“data pr

sakoko_的博客 4万+

代码大全读书笔记(第二部分)——创建高质量的代码

目录 第五章:软件构建中的设计 设计是一个险恶的问题 关键的设计概念 理想的设计应有的特征 设计的层次 第一层:软件系统 第二层:子系统 第三层:类 第四层:分解成子程序 第五层:子程序内部的设计 设计的方法 找出现实世界中的对象 形成一致的抽象 封装实现细节 当继承能简化设计时就用继承 信息隐藏 找出容易改变的区域 保持松散耦合 耦合的种类: 常用设...

学无止境 327

智能安防摄像头埋点实践:用户行为与设备状态的闭环监控(含AI事件)

智能安防摄像头埋点闭环体系设计及应用实践 摘要: 本文系统阐述了智能安防摄像头埋点闭环体系的设计与实践。首先分析了传统埋点的不足及闭环埋点的价值,提出由用户行为埋点、设备状态埋点和AI事件埋点构成的三维埋点体系框架。详细介绍了闭环监控的四大流程:数据采集、汇聚清洗、分析建模和智能决策。通过误报优化、个性化策略等案例展示了AI事件闭环的实际应用价值,并探讨了隐私合规、性能优化等关键挑战的解决思路。最后展望了端侧AI增强、预测型埋点等未来发展趋势。该体系实现了从数据采集到业务决策的完整闭环,有效提升了AI模型性

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 1046

别再只盯着DDR5了!聊聊3D DRAM:它凭什么能解决AI算力的内存墙难题?

本文深入探讨了3D DRAM技术如何突破AI算力的内存墙限制。通过立体堆叠架构,3D DRAM在存储密度、带宽和延迟方面实现显著提升,有效解决AI训练和推理中的内存瓶颈问题。文章还分析了三星、SK海力士等巨头的技术路线图,并指出商业化面临的挑战与机遇。

weixin_42685438的博客 188

读书笔记:《代码大全2》

        本书在笔者实习时就已经开始阅读,按照自己的所处阶段有间隔的分成了3次阅读,一直到现在终于完成了。读者千万不要认为这本书真的只是“代码大全”,在我看来,这本书就是软件工程师的心法,提升软件工程的认知、意识。各种技术层出不穷,也有很多技术最终消失在时间里,但这本书的精髓则适用于每一代软件开发者。        本身还提供了各方面的CheckList,可以借助这部分CheckList培养...

key_next的博客 7366

五、2K0300 久久派开发板的GPIO控制与Shell脚本自动化实战

本文详细介绍了基于龙芯2K0300处理器的久久派开发板的GPIO控制方法,通过sysfs文件系统实现LED控制和传感器读取。重点讲解了Shell脚本自动化实战,包括LED闪烁、流水灯效果和传感器数据采集,为物联网项目开发提供完整解决方案。

silver的专栏 686

读书笔记:《代码大全第2版》 04.创建高质量的代码之高质量的方法

文章目录高质量的方法1、创建方法的理由2、内聚性(cohesion)3、方法命名4、方法参数5、总结 高质量的方法 1、创建方法的理由 降低复杂度 引入中间的,易懂的抽象 避免代码的重复 支持子类重写(子类重写简短而规整的方法要比冗长而邋遢的方法更好) 隐藏顺序 隐藏指针操作 提高可移植性 简化复杂的布尔判断(有时候将一些简单的操作写出独立的方法会具有更好的可读性)...

github_39353936的博客 227

【项目实战】SOVD协议(面向服务的车辆诊断协议)

此外,AUTOSAR组织将SOVD部分内容的软件实现定义在了R22-11及以上版本的AUTOSAR Adaptive规范中,还支持动态发现车内诊断功能、获取高性能计算机(HPC)的Log信息等新的诊断需求,更符合当前软件定义汽车概念下的行业趋势。而SOVDGateway作为边缘节点,也肩负着对SOVD Client进行认证以及权限控制的责任,从而保证车辆的信息安全。相较于传统的UDS(Unified Diagnostic Services)协议,SOVD不仅保留了传统的读写数据、例程控制、故障读取等功能,

奶爸的编程之路,也就一周冷个三天 1900

MTK(基础篇)ROM烧录以及分区的作用

本文介绍了MTK芯片设备的刷机流程及关键分区功能。首先通过MTK烧录工具加载ROM文件(包括引导文件和分区表),重点解析了各分区的核心作用:preloader类似BIOS负责硬件初始化;lk作为二级引导程序加载内核;vbmeta验证系统完整性;boot包含Linux内核;dtbo调整硬件配置;modem管理通信功能;tee保护生物识别数据;system/vendor分别存放系统核心和硬件驱动。特别指出preloader、vbmeta等关键分区损坏会导致设备变砖,而recovery分区是重要的救砖入口。全文简

weixin_49303682的博客 443

代码大全 读书笔记

代码大全读书笔记Chap7-9第 7 章 高质量的子程序7.1 章节概述7.2 关键内容7.2.1 概念相关7.2.2 关键内容7.3 思维导图第8 章 防御式编程8.1 章节概述8.2 关键内容8.2.1 概念相关8.2.2 关键内容8.3 思维导图第 9 章 第9章伪代码编程过程9.1 章节概述9.2 关键内容9.2.1 概念相关9.2.2 关键内容9.3 思维导图 第 7 章 高质量的子程序 7.1 章节概述 本章主要介绍何为高质量的子程序,以及如何构建高质量的子程序的内容。介绍的内容包括为何创建子程

GorMing 的博客 411

uniapp - 解决报错Error in event handler for “service.requestComponentInfo“: “TypeError: cannot read prop

uniapp,报错,Error in event handler for "service.requestComponentInfo": "TypeError: cannot read properties of undefined (reading 'matches')",h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,如何解决这个问题,一直报错,uniapp报错Error,都检查了还是报错,怎么解决这个错误,uniapp出现Error in event han

🏆 前端领域优质创作者 6379

读书笔记:《代码大全第2版》 06.创建高质量的代码之伪代码编程

文章目录伪代码编程过程1、类和子程序的创建过程2、伪代码3、通过伪代码创建子程序3.1 设计子程序3.2 编写子程序的代码3.3 检查代码3.4 收尾工作4、总结 伪代码编程过程 创建类和子程序通常都是一个迭代的过程。在创建子程序的过程中获得的认识常常会反过来影响类的设计。 1、类和子程序的创建过程 类的创建过程 子程序的创建过程 2、伪代码 如何编写一段伪代码: 用类似英语的语句来精确描述...

github_39353936的博客 505

RT-DETR改进策略【Conv和Transformer】| ICCV-2023 iRMB 倒置残差移动块 轻量化的注意力模块

本文记录的是利用模块优化的目标检测网络模型。的作用在于克服了常见模块无法同时吸收CNN 效率建模局部特征和利用Transformer 动态建模能力学习长距离交互的问题。相比一些复杂结构或多个混合模块的方法,能更好地权衡模型成本和精度。本文将其用于的模型改进和二次创新,更好地突出重要特征,提升模型性能。Rethinking Mobile Block for Efficient Attention-based Models从微观角度看,由和组成。及其改进的实现代码如下: 四、创新模块 4.1 改进点1⭐ 模块

Limiiiing的博客 816

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

代码大全第二版读书笔记 第二部分-创建高质量的代码 九、伪代码编程过程

伪代码编程过程(P215) 伪代码有助于减少设计和编写文档所需的工作量,同时提高这两项工作的质量。 1.创建类和子程序的步骤概述 1)创建一个类的步骤 创建类的总体设计创建类中的子程序复审并测试整个类 以上是一个迭代的过程。 2)创建子程序的步骤 设计子程序检查设计编写子程序的代码复审并测试代码 同样,以上是一个迭代的过程。 2.伪代码

CODING 827

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

《代码大全2》读书笔记——序

序听说有一本书,名叫《代码大全》,很经典。今天去买了一本,好贵!但推荐说很值得。不过关键还是要看,并且要吸收,这才值。看了译序和前言,大致了解到以下信息:1、书中所讲的是:如何编写高质量的代码,并提供了提高代码质量的技术和决窍。代码主要是供人阅读的,所以首先应该为人编写代码,其次才是为机器。2、阅读建议:对自学编程的人,可先看第7章“高质量的子程序”,详细讨论了子程序的命名和参数选

fan_jinyong的专栏 1203

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

代码大全2读书笔记【6-8章】

ADT:描述类的数据和操作(子程序) 好处:能够隐藏实现细节和内部数据,降低耦合,增加可读性,方便维护(发现错误不用一个个地方修改,只用修改一处,就是这个方法)。类的接口应该展现一致的抽象层次 根据类就大概能知道类的作用 没有良好抽象的类,各类型混杂的方法职能不专一,会让程序越来越难以理解 一定要理解类所实现的抽象是什么 一些类很相似,需要理解类的接口需要的抽象是哪一个。可能使用的时候我们暂时都可以用,但是一定要仔细考虑。提供成对的服务 创建子程序的时候,需要考虑是否需要创建与之互补的另一个操作。把不相关的

qq_35515283的博客 998

代码大全读书笔记(第二部分)——可以工作的类、高质量的子程序

目录 第六章:可以工作的类 6.1类的基础:抽象数据类型 6.2良好的类接口 如何设计类接口 良好的封装 6.3有关设计和实现的问题 包含关系(有一个...的关系) 继承关系(是一个...的关系) 成员函数和数据成员 构造函数 6.4创建类的原因 第七章:高质量的子程序 7.1 创建子程序的理由 过于简单的子程序存在的作用 7.2在子程序层上设计 应该有的内...

学无止境 281

读书笔记:《代码大全第2版》 05.创建高质量的代码之防御式编程

文章目录防御式编程1、保护程序免遭非法输入数据的破坏2、断言3、错误处理技术4、异常5、隔栏(Barricade)6、线上代码中该保留多少防御式代码7、总结 防御式编程 防御式编程的主要思想:方法应该不因传入错误数据而被破坏,哪怕是由其他方法产生的错误数据。 防御式编程的最佳方式就是在一开始不要在代码中引入错误。使用迭代、编码前先写伪代码、写代码前先写测试用例、低层设计检查等活动,都有助于防止引入...

github_39353936的博客 250

Code Complete《代码大全》读书笔记

最近拜读了《代码大全》,这部大块头确实经典,涉及到了软件开发的方方面面。有点后悔没有早些阅读,值得推荐给还没读过的朋友。它并不是针对某种语言的武林秘籍,应该可以看作是基础内功修炼吧。 笔记比较简略,只供简单查阅~ 一、开发前期准备相关 1.需求阶段: 发现错误的时间要尽量接近进入该错误的时间。由于需求是首先进行的活动,所以需求阶段引入的缺陷可能在系统中潜伏的时间最长,代价也更昂贵。 如果没有一个良好的问题定义,你努力解决的可能是一个错误的问题。 明确的需求有助于确保用户驾驭系统的能力; ...

Peter的博客 2384

《代码大全》读书笔记

文章目录第1部分第2部分第7章 高质量的子程序7.3 好的子程序名字7.5 如何使用子程序参数7.6 使用函数时要特别考虑的问题第8章 防御式编程第9章 伪代码编程过程创建类和子程序的步骤概述第3部分 变量第10章 使用变量的一般事项10.1 数据认知10.2 轻松掌握变量定义10.3 变量初始化原则10.4 作用域10.5 持续性10.6 绑定时间10.7 数据类型和控制结构之间的关系第11章 变量名的力量11.1 选择好变量名的注意事项11.2 为特定类型的数据命名11.3 命名规则的力量11.4 非正

淡水瑜的博客 1973

代码大全2读书笔记

代码大全2读书笔记 作者写这本书的首要目的,就是希望缩小本行业中一般商用实践与大师级人物及专家们之间的知识差距。许多强大的编程技术在被编程领域的大众接触之前,都已在学术论文和期刊里尘封了多年。 成功学大师拿破仑希尔说过:什么思想决定什么样行为;什么样行为决定什么样的习惯,什么样的习惯决定什么样性格,而什么性格决定什么样的命运。 本书给我印象较深刻的章节有:前期准备、软件构建...

weixin_30409849的博客 422
上一篇: 读书笔记:《代码大全第2版》 02.创建高质量的代码之软件构建中的设计
下一篇: 读书笔记:《代码大全第2版》 04.创建高质量的代码之高质量的方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值