7个软件开发原则

2026年VIVO嵌入式岗位高频面试题(含参考答案) 摘要:VIVO嵌入式岗位考核涵盖智能手机、IoT设备、芯片适配等方向,重点考察硬件底层交互、RTOS/Linux开发、C/C++功底与问题排查能力。题目按优先级排序,分硬件架构、RTOS、C/C++、数据结构、Linux实践、行业认知6大模块,共40道题。硬件部分涉及中断、ARM架构、加速技术、BSP开发等;RTOS部分区分硬/软实时系统;C/C++部分侧重内存管理、位操作;Linux部分考察常用命令;行业部分关注鸿蒙等系统理念。题目设计贴合实际工作场景,全面评估嵌入式开发能力。 阅读详情

关于代码重复最著名的单词是Kent Beck的Once And Only Once,也就是说软件操作的任何一个片断–不管是一个算法,一个常量集合,用于阅读的文档或者其他东西–应当只出现一次。
软件重复出现至少会导致以下问题:
· 其中的一个版本会过期;
· 代码的责任会四处分散,导致代码难以理解;
· 当你修改代码时,需要重复修改很多地方,一不小心就会遗漏;
· 你不能很好地进行性能优化 。
重复代码的产生有各种各样的原因,程序员把几行或一整段代码从那里复制到这里,然后少加修改,就变成了一份新的代码。这里的原因是程序员可以通过极少的努力就完成代码重用。但是我们可以来看看DavidHooker提出的7个软件开发原则:
1.第一原则:存在的理由(Pattern: TheReason)
一个软件系统存在的理由就是:为它的用户提供价值。你所有的决定都取决于这一点。在指定一个系统需求,在写下一段系统功能,在决定硬件平台和开发过程之前,问你自己一个问题,“这样做会为系统增加价值吗?“,如果答案是”yes”,做。如果是”No”,不做。这个原则是其他原则的原则。
2.第二原则(能简单就简单,愚蠢!)KISS (Pattern: KeepItSimple&Stupid)
软件设计不是一个轻描淡写的过程。在做任何一个设计时,你必须考虑很多因素。所有设计应当尽可能简单,但是不要再比这简单了。这样产生的系统才是可以理解 和容易维护的。这并不是说很多有意义的特性,因为这种简单性也要被抛弃。确实很多更优雅的设计往往更简单,但简单并不意味着“quick and dirty.”。事实上,简单是通过许多思考和一次一次的反复修改才达到的。这些努力的汇报就是更容易维护,代码错误更少。 (看看是否违反)
3.第三原则 :保持远见(Pattern: MaintainTheVision)
清晰的远见是一个软件项目成功的基础。没有这样的远见,项目开发最后就变成天天为一个不好的设计做补丁。Brooks说过: 概念的完整性是系统设计中最重要的问题。 Stroustrup 也说: 有一个干净的内部结构是构建一个可理解、可辨识、可维护 、可测试系统的基础。 Booch则总结道: 只有当你对系统的体系有一个清晰的感觉,才可能去发现通用的抽象和机制。开发这种通用性最终导致系统更简单,因此更小、更可靠。 如果你不断地复制、粘贴、修改代码,最终你将陷入一个大泥潭(the Big Mud), 你永远不可能对系统有一个清晰的认识。
4.第四原则:你制造的,别人会消费 (Pattern: WhatYouProduceTheyConsume)
软件系统不是在真空中使用的。其他人会使用、维护、文档化你的系统。这依赖于对你系统的理解。所以,你设计、实现的东西应当能够让别人理解。要记住,你写的代码并非只给计算机看,你要时时记住,代码还要给人看(Kent Beck) 。如果到处泛滥似是而非的代码,别人如何能够辨别这些代码的相似和不同,如何去理解这些代码之间具有何种关系。
5.第五原则:对将来开放( Pattern BuildForTodayDesignForTomorrow)
一个成功的软件有很长的生命期。你必须能够使得软件能够适应这样和那样的变化。所以,一开始就不要将软件设计到死角上去。请总是问一下自己“如果这样,那 么。。?“这个问题,你要考虑到各种各样的可能性,而不光光是图省事。复制,粘贴一下即可。
6.第六原则:为重用做好计划
软件模式是重用计划的一种。不断重复的代码显然不是这样的计划。 (See CommentsOnSix)
7.第七原则:思考!
在采取任何动作之前首先做一个清晰、完整的考虑,这样才能产生更好的结果。如果你考虑了,但还是产生错误的结果,那么这种努力也是值得的。在你学习或研究类似的问题时,将更容易理解和掌握。
这些原则告诉我们轻松地复制、粘贴和修改代码不可能产生好的,也就是容易理解、维护、重用的代码。但请不要走极端。 我一直认为,一个好的软件系统是各种因素权衡的结果,也就是你如何把握一个度的问题。重复代码产生的另外一个主要原因就是做得太多,XP有一个基本原则叫做You Arent Gonna Need It,它是说“只实现你真正需要的东西,从来都不要去实现你预期需要的东西“。如果你去实现你现在认为将来需要的东西,不一定就是你以后真正需要的东西。你处 于现在的环境中,可能无法理解你将来要实现的东西究竟是什么样子的。你会浪费大量的时间去构造这样不知道是否必须的可能性。同时,当你真正实现的时候就可能产生重 复代码。
Martin Fowler在它的Refactoring一书中有很多用来处理代码重复,包括:
1. 同一个类的两个方法中有相同的表达式,使用Extract method,然后大家都调用该method;
2. 两个兄弟子类之间有相同的表达式,那么在这两个子类中使用Extract Method,接着使用pull up method, 移到共同的超类。
3. 如果结构相似而并非完全相同,用Extract method把相同部分和不同部分分开。然后使用Form Template method. 4. 如果两个方法使用不同的算法做相同的事情,那么使用Substitute Algorithm.
5. 如果在两个不相干的类中有重复代码,那么在一个类中使用Extract class,然后在其他类中使用该class对象作为元素(委托)。
等等。
重复代码需要refactoring是毫无疑问的,关键在于,你如何找到重复代码,如果所有的重复代码都是死板的重复,那问题是很容易解决的。但是软件开发的复杂因素可能往往使重复代码表现为相似性而并非完全的重复。这些相似性可能并非一眼就能看出来。而是需要经过其它的Refactory步骤和一定的先见之明。 另一个问题就是排除重复代码的粒度,只有大段的重复代码有价值去排除,还是即使是小小的2、3句重复代码就应该去排除。重复代码排除的基本方法是建立自己单独的方法,如果系统中许许多多的方法都很小,方法之间相互调用的开销就会增加,它同时也增加了维护的开销。 但是,这些开销是值得的。方法是覆盖的最小粒度,能够被覆盖的粒度越小,能够重用的范围和程度就愈广。但在这个问题上也不要走极端,只有当一个方法实现一个具体的可以用Intent Revealing Name(揭示意图的名字)命名时,一段代码才值得称为一个方法,而不是考虑其代码的多少。
Martin Fowler在他的refactoring中描述了很多这样的例子,Kent Beck则在Smalltalk Best Practice Pattern中更基础地揭示了隐含在这些refactoing下的意图。
下面是一个实际的例子,来自于Martin Fowler在ACM上的设计专栏:

  class Invoice... String asciiStatement() { 
StringBuffer result = new StringBuffer(); 
result.append(“Bill for “ + customer + “/n”); 
Iterator it = items.iterator(); while(it.hasNext()) 
{ 
LineItem each = (LineItem) it.next(); 
result.append(“/t” + each.product() + “/t/t” + each.amount() + “/n”); 
} result.append(“total owed:” + total + “/n”); 
return result.toString(); 
} 
String htmlStatement() 
{ 
StringBuffer result = new StringBuffer(); 
result.append(“ Bill for ” + customer + “ 
”); result.append(“”); 
Iterator it = items.iterator(); 
while(it.hasNext()) 
{ 
LineItem each = (LineItem) it.next(); 
result.append(“ ” + each.product() + “ ” + each.amount() + “ ”); 
} result.append(“ ”); result.append(“ total owed:” + total + “ 
”); return result.toString(); } 
}   
asciiStatement和htmlStatement具有类似的基础结构,但是它们的实际步骤却有所不同。他们都完成三件事情: 

1. 打印发票头
2. 循环每一个项目,并打印
3. 打印发票尾部
这种结构的相似性和意图马上上我们使用composed method(也就是Martin Fowler的Extract method):

interface Printer 
{ 
String header(Invoice iv); 
String item(LineItem line); 
String footer(Invoice iv); 
} 
static class AsciiPrinter implements Printer 
{ 
public String header(Invoice iv) 
{ 
return “Bill for “ + iv.customer + “/n”; 
} 
public String item(LineItem line) 
{ 
return “/t” + line.product()+ “/t/t” + line.amount() +“/n”; 
} 
public String footer(Invoice iv) 
{ 
return “total owed:” + iv.total + “/n”; 
} 
} 

象html则可以实现htmlPrinter.

class Invoice... public String statement(Printer pr) 
{ 
StringBuffer result = new StringBuffer(); 
result.append(pr.header(this)); 
Iterator it = items.iterator(); 
while(it.hasNext()) 
{ 
LineItem each = (LineItem) it.next(); 
result.append(pr.item(each)); 
} 
result.append(pr.footer(this)); 
return result.toString(); 
} 
class Invoice... public String asciiStatement2() 
{ 
return statement (new AsciiPrinter()); 
} 

现在,statement包含一个通用的结构,重复性已经被排除。更重要的是,你可以实现其它的Printer,XXXPrinter,从而能够轻 易地扩展系统。 BTW,Martin Fowler在这里使用了Dispatched Interpretation模式,statement隐瞒了内部的细节,它隐藏内部的数据和表示,当它需要Printer做一件事情时,它负责解码内部 的数据结构,然后反过来把消息传给Printer.

参见:Martin Fowler:Refactoring:Improve the design of Existing Code Kent Beck : Smalltalk Best Pratice Pattern ACM: Martin Fowler Design column:Reduce repetation Kent Beck: Extreme Programming Explained

亚马逊跨境电商选品数据分析:Python爬虫实战指南 本文将带领大家构建一套完整的亚马逊选品数据采集与分析系统,使用最新的Python技术栈,从零开始爬取亚马逊商品数据,并进行深度分析。 阅读详情

相关推荐

AT32F421玩转AM32电调:手把手教你调试过零点比较器,告别电机抖动

本文详细介绍了如何使用AT32F421芯片调试AM32电调的过零点比较器,解决电机抖动问题。通过硬件配置、软件环境搭建、比较器电路原理分析及filter_level参数动态调整等实战步骤,帮助开发者精准诊断和优化电机控制性能。

weixin_42525632的博客 277

软件开发的7个原则

软件开发的7个原则 1. 开闭原则 定义: 开闭原则(Open-Closed Principle, OCP)是指一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。强调的是用抽象构建框架,用实现扩展细节。可以提高软件系统的可复用性及可维护性。开闭原则,是面向对象设计中最基础的设计原则。 它指导我们如何建立稳定灵活的系统,例如:我们版本更新,我尽...

qq_42145271的博客 2891

SRAM vs RRAM:存算一体芯片选型指南(含最新技术对比)

本文深入对比了SRAM与RRAM在存算一体芯片设计中的核心差异,为硬件工程师和架构师提供实战选型指南。文章从技术本质、性能、功耗、成本及设计风险等多维度剖析,指出SRAM基于成熟CMOS工艺,适合高精度、低延迟场景;而RRAM凭借非易失性和高密度潜力,在超低功耗、固定模型应用中优势明显。决策需综合项目预算、上市时间及技术储备。

e4f5g6h的博客 941

十大开发代码原则

本原则是本人结合项目的实施开发编写代码情况,对多年以来带领项目实施奋战在开发一线经验的提炼与概括。这十条开发指导原则,最基本的思想是“高效,高质量的写出满足业务功能目标的代码。”每人可以结合当前项目的实际情况应用,可以补充,修订删改进一步总结提炼。 1.先开发简单明确的功能模块,后开发复杂的功能模块。 2.先做简单的子功能,再做稍微复杂的子功能,后开发有难度逻辑复杂的子功能。 3.以满足业务

赵玉的专栏 2万+

关于STM32编译报错:Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o).

今天新建工程发现出现一个错误 —— …\Output\CG.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o). 但我觉得我的操作没有任何问题,而且配置和上一个文件比较是一模一样的。 于是我开始百度查询,然后发现了下面几个博客—— @weixin_44133391——STM32 编译错误 @dorlolok——iel5 编译报错 error: L6235E: More than one

纯粹,学术,热爱。 9403

港口集装箱码头运营FlexSim仿真

列队4中的集装箱会根据不同类型的集装箱会放置在不同的堆场,因此根据前面对集装箱设置的标签Type的数值不同,设置不同的发送端口。集装箱到达列队3后,会有70%的集装箱到达堆场,30%的集装箱运出港口,因此在Queue列队3的Flow界面设置按照百分比发送端口,其中70%发送到端口1,即发送到列队4等待进入堆场,30%发送到端口2,即发送至出闸口。通过上述对比表格可以看出,当集卡数量在10的时候,岸桥和场桥的设备利用率达到了最高,当集卡数量为12的时候场桥1和场桥3的利用率有所下降,因此综合考虑。

m0_72514516的博客 1331

软件设计的七大原则

学习设计原则是学习设计模式的基础。在实际开发过程中,并不一定要求所有代码都遵循设计原则,只需要在适当的场景遵循设计原则,就可以帮助开发者设计出更加优雅的代码结构。

积跬步,至千里。 1万+

机器学习之多种算法优缺点总结及优化方法

一、无监督算法: 1、聚类算法:Kmeans 2、关联规则算法:Apriori 二、有监督算法 1、分类算法 决策树(Decision Tree) 支持向量机(SVM) K近邻(kNN,k-NearestNeighbor) 朴素贝叶斯 逻辑回归 2、回归算法 线性回归 多项式回归 3、集成算法 a、bagging(Bootstrapped Aggregation) 随机森林 ...

平原的博客 7081

软件设计六大原则

软件设计六大原则

qq_61267719的博客 465

计算机组成原理(第三版)唐朔飞-第九章控制单元的功能-课后习题

计算机组成原理(第三版)唐朔飞-第九章控制单元的功能-课后习题

weixin_45735391的博客 4万+

工业产线瑕疵检测:基于 YOLO 的自动化质检系统实战

从工业瑕疵数据集构建到模型训练,从桌面检测界面到产线适用性优化,本文覆盖了一套工业质检系统的完整路线。这个场景的核心评价指标不是最高精度,而是在保证 recall ≥ 0.95 的前提下尽可能压低 false positive——因为漏检的直接成本(客户投诉、质量事故)远高于误报的成本(人工复检)。部署时先设一个偏低的置信度阈值确保覆盖,再通过持续收集人工复检数据来逐步调优。

m0_71589036的博客 67

掌握这7种软件设计原则,让你的代码更优雅

以上介绍了7种常见的软件设计原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则、依赖倒置原则、迪米特法则和合成复用原则。这些原则在软件开发过程中起着重要的指导作用,它们可以帮助我们创建出更加清晰、可维护和可扩展的软件系统。在实际开发中,我们应该根据项目的需求和特点选择合适的设计原则来指导我们的编码工作。

让每一行代码都有改变世界的力量 2258

SPICE仿真软件:HSPICE_(20).HSPICE仿真结果的后处理

HSPICE仿真结果的后处理是一个多步骤的过程,包括读取结果文件、可视化、分析和导出。通过使用命令行工具、Python脚本和HSPICE内置工具,可以高效、准确地完成这些任务。Python脚本的灵活性和强大的数据分析能力使其成为后处理的理想选择。自动化处理可以显著提高工作效率,减少人为错误,而高级分析方法可以更深入地理解仿真结果,为电路设计提供有力支持。

kkchenjj的博客 1382

更好的编程 | 每天都应遵循的7个软件开发原则:“KISS”、“DRY”、“YAGNI”等

这些原则并不复杂。事实上,正是它们的简单性让它们如此美妙。如果你觉得不知所措,不要担心。目前,你只需要努力提高自己的意识,并尝试一次将一个原则融入到你的日常工作中。有一些基本但强大的原则可遵循,这将有助于你成为一名更好的程序员,并让你更清楚为什么要做这些事情。如果你已经在凭直觉应用其中的大部分原则,那么当你明白为什么自己一直以某种方式做事时,那种顿悟的感觉是很好的。

Vampire_2017的博客 2052

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

软件开发的7大原则

1.开闭原则 开闭原则(Open Closed Principle,OCP)由勃兰特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作《面向对象软件构造》(Object Oriented Software Construction)中提出:软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification),这就是开闭原则的经典定义。 2.里氏替换原则 里氏替换原则(

AlisaMa233的博客 2125

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

软件开发7大原则

1.里氏替换原则-LSP: The Liskov substitution principle  子类必须能够替换基类(重要的)  子类不加额外约束  尽量继承抽象类接口(重要的)a) LSP关注的是怎样良好的使用继承. b) 必须要清楚是使用一个Method还是要扩展它,但是绝对不是改变它。 c) .LSP清晰的指出,OOD的IS-A关系是就行为方式而言,行为方式是可以进行合理假设的,是客户程序

java 699

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

好文章!7个软件开发原则

关于代码重复最著名的单词是Kent Beck的Once And Only Once,也就是说软件操作的任何一个片断--不管是一个算法,一个常量集合,用于阅读的文档或者其他东西--应当只出现一次。 软件重复出现至少会导致以下问题: · 其中的一个版本会过期 · 代码的责任会四处散开,导致代码难以理解 · 当你修改代码时,需要重复修改很多地方,一不小心就会遗漏 · 你不能很好地进行性能优化 我以前

928

7个软件开发原则(转载)

关于代码重复最著名的单词是Kent Beck的Once And Only Once,也就是说软件操作的任何一个片断--不管是一个算法,一个常量集合,用于阅读的文档或者其他东西--应当只出现一次。 软件重复出现至少会导致以下问题: 1 其中的一个版本会过期 2 代码的责任会四处散开,导致代码难以理解 3 当你修改代码时,需要重复修改很多地方,一不小心就会遗漏 4 你不能很好地进行性能优化      

佳佳的专栏 866

软件开发的7大原则《转载》

1.开闭原则 开闭原则(Open Closed Principle,OCP)由勃兰特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作《面向对象软件构造》(Object Oriented Software Construction)中提出:软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification),这就是开闭原则的经典定义。 2.里氏替换原则 里氏替换原则(

冬眠的白兔 247

Kotlin~软件开发7大原则

降低对象之间的耦合; 增加程序的可复用、可扩展性和可维护性

Hynson的学习笔记 578

7个软件开发原则 (转贴)

非常好的文章,转来自己慢慢享用... 关于代码重复最著名的单词是Kent Beck的Once And Only Once,也就是说软件操作的任何一个片断--不管是一个算法,一个常量集合,用于阅读的文档或者其他东西--应当只出现一次。 软件重复出现至少会导致以下问题: · 其中的一个版本会过期 · 代码的责任会四处散开,导致代码难以理解 · 当你修改代码时,需要重复修改很多地方,一不小心就会

赛跑的专栏 934

7个软件开发原则 (ZT)

关于代码重复最著名的单词是Kent Beck的Once And Only Once,也就是说软件操作的任何一个片断--不管是一个算法,一个常量集合,用于阅读的文档或者其他东西--应当只出现一次。 软件重复出现至少会导致以下问题: · 其中的一个版本会过期 · 代码的责任会四处散开,导致代码难以理解 · 当你修改代码时,需要重复修改很多地方,一不小心就会遗漏 · 你不能很好地进行性能优化 我以前的一

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 1154
上一篇: 项目间移植代码时的一个感悟——解除依赖链!
下一篇: 一些软件开发的原则
e5Max
博客等级 码龄14年 145粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值