Questions tagged «clean-code»

术语“干净的代码”用于描述简洁,易于理解并清楚表达程序员意图的计算机编程代码。带有此标签的问题与编写干净代码或将旧的“脏”代码重构为干净代码的过程有关。

4
善用try catch块吗?
我总是觉得自己很努力……试图在try / catching和代码之间保持正确的平衡,而这些代码又不会变成令人讨厌的选项卡,方括号和异常,就像火薯一样被扔回到调用堆栈中。例如,我有一个正在开发的使用SQLite的应用程序。我有一个抽象SQLite调用的数据库接口,以及一个接受要进出数据库的事物的模型...因此,如果/当发生SQLite异常时,必须将其扔给模型(被称为模型) ),谁必须将其传递给调用AddRecord / DeleteRecord / whatever ... 我喜欢异常,而不是返回错误代码,因为错误代码可以忽略,遗忘等,而本质上必须处理异常(允许,我可以立即捕获并继续前进...)肯定有比我现在要做的更好的方法。 编辑: 我应该用一些不同的措辞。我知道要重新投掷不同类型的球,我的措辞很差,这是我自己的错。我的问题是……这样做时如何最好地保持代码干净?过了一会儿,它才开始让我感到非常混乱。



2
如马丁的《清洁法》所指,输出自变量是什么?
在Robert C. Martin的“清洁代码:敏捷软件技巧手册”的第45页上,Martin写道,应避免使用输出参数。我在理解“输出参数”的含义以及为什么应避免使用它们时遇到了麻烦。 马丁的输出参数示例appendFooter(s);调用了function public void appendFooter(StringBuffer report)。他对代码的改进是report.appendFooter(); 也许是由于缺少代码上下文所致,但是我看不出如何使用输出参数被认为是较差的编码。有人可以解释这个概念或提供其他示例代码来理解这一点吗? 根据上述原理,以下功能是否也可以视为不洁代码的示例? int[] numberArray = {3, 5, 7, 1}; sortArray(numberArray); 如果以上内容违反了马丁不使用输出参数的原则,那么最好让一个对象具有一个数组作为字段和一个可以调用以对数组进行排序的函数? ObjectWithArrayField numberArray = new ObjectWithArrayField(3, 5, 7, 1); numberArray.sort();
14 java  clean-code 

4
最小化函数参数数量的技术
在“干净代码”中,写有“函数的理想参数个数为零”。解释原因并讲得通。我所需要的是重构具有4个或更多参数的方法来解决此问题的技术。 一种方法是将参数提取到新的类中,但是那肯定会导致类的爆炸式增长吗?那些类可能以违反某些命名规则的名称结尾(以“ Data”或“ Info”等结尾)? 另一种技术是使多个函数使用的变量成为私有成员变量,以避免传递它们,但这扩大了变量的范围,可能使它向实际上不需要它的函数开放。 只是寻找使函数参数最小化的方法,就已经接受了这样做的好主意。

6
是否有一个案例研究可以令人信服地证明干净的代码可以改善开发?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 10个月前关闭。 我是程序员的第一份实际工作,我看到的只是“ Big Ball of Mud”代码(也没有有用的注释),但是我喜欢编写干净的代码,这对我来说很难编码办法。 我正在寻找一些研究案例,这些案例中使用干净的代码(这里看到了什么是干净的代码)改善了开发和可维护性。

4
域与数据持久层中的干净架构验证?
我正在研究干净的软件,因此,我极大地重新思考了如何设计和编写软件的大量方法。 不过,我仍在努力处理业务规则,例如“保存某些项目的更新,首先加载我有权查看/编辑的所有项目列表,确认该项目在列表中,并且该商品类别当前未被锁定(以及其他规则等)。”,因为这是(复杂但非典型的)业务规则,因此应在应用程序域中进行处理,而不是将业务逻辑推送到db / persistence层。 但是在我看来,为了有效地检查这些条件,通常最好使用精心设计的数据库查询来最好地处理它,而不是将所有数据加载到应用程序域中... 如果不进行过早的优化,有什么推荐的方法或鲍勃叔叔的文章处理这个问题?还是他会说“在域中进行验证,直到出现问题”? 除了最基本的用例之外,我真的在努力寻找任何好的示例/样本。 更新: 大家好,谢谢您的答复。我应该更清楚一些,我已经写了很长时间(主要是Web应用程序)软件,并且肯定已经经历并同意您共同描述的所有主题(通过后端验证,一般不信任客户端数据仅在需要时才追求原始效率,但是在可用时承认db工具的优势,等等),并且已经经历了开发人员学习生命周期的“全部整合”以“构建具有N层应用程序的大型胖控制器”代码趋势,现在真的很喜欢研究干净/单一责任的样式等,这主要是由于最近有一些项目随着项目的发展以及对客户的进一步要求逐渐演变为笨拙且分布广泛的业务规则。 特别是,我在构建REST的API面向客户和内部使用功能的背景下,看着清新的风格建筑,其中许多业务规则可能是多比基本上你在网上看到每一个例子更复杂(甚至由Clean / Hex体系结构专家自己完成)。 所以我想我真的是在问(并且没有清楚地说出)Clean和REST api会如何放置在一起,这些天您看到的大多数MVC东西都带有传入的请求验证器(例如.NET中的FluentValidation库),但是其中许多我的“验证”规则不是“这是少于50个字符的字符串”,而是更多的,“如果某个相关对象当前已被Team X锁定,则该调用此用户案例/交互者的用户可以对数据集执行此操作吗?直到本月下旬,等等”。。。那些涉及深层次的验证,其中适用于业务域对象和域规则的数量。 我是否应该将这些规则分解为特定类型的Validator-object类型,以与每个用例交互器一起使用(受FluentValidator项目的启发,但涉及更多的业务逻辑和数据访问),我是否应该将验证视为类似于Gateway,我应该将那些验证放入网关(我认为这是错误的)等。 作为参考,我会去像几篇文章这样,但马蒂亚不讨论验证了。 但是我想我的问题的简短答案很像我接受的答案:“这绝非易事,要视情况而定”。

8
使用一种可以在客户之间变化的方法对类进行正确的设计
我有一个用于处理客户付款的类。除了一个类(用于计算(例如)客户的用户欠款额的)方法外,对于每个客户而言,此类中的一种方法均是相同的。各个客户之间的差异可能很大,并且由于存在许多自定义因素,因此没有简单的方法来捕获诸如属性文件之类的计算逻辑。 我可以编写难看的代码,以根据customerID进行切换: switch(customerID) { case 101: .. do calculations for customer 101 case 102: .. do calculations for customer 102 case 103: .. do calculations for customer 103 etc } 但这需要在我们每次获得新客户时都重新构建班级。有什么更好的方法? [编辑]“重复”的文章完全不同。我不是在问如何避免使用switch语句,而是在寻求最适合这种情况的现代设计-如果我想编写恐龙代码,可以使用switch语句解决。此处提供的示例是通用的,无济于事,因为它们本质上是在说“嘿,在某些情况下,此开关工作得很好,而在另一些情况下,则效果很好。” [编辑]我决定采用排名靠前的答案(为实现标准接口的每个客户创建一个单独的“客户”类),原因如下: 一致性:我可以创建一个接口,以确保所有Customer类都可以接收并返回相同的输出,即使是由其他开发人员创建的 可维护性:所有代码都使用相同的语言(Java)编写,因此无需其他任何人学习单独的编码语言来维护应该是简陋的功能。 重用:如果在代码中出现了类似的问题,我可以重用Customer类来容纳许多方法来实现“自定义”逻辑。 熟悉:我已经知道如何执行此操作,因此我可以快速完成它,然后继续处理其他更紧迫的问题。 缺点: 每个新客户都需要编译新的Customer类,这可能会增加我们编译和部署更改的方式的复杂性。 每个新客户都必须由开发人员添加-支持人员不能只是将逻辑添加到属性文件之类的东西中。这不是理想的选择……但是后来我也不确定支持人员将如何写出必要的业务逻辑,尤其是当它很复杂且有很多例外时(很可能)。 如果我们增加许多新客户,它将无法很好地扩展。这是不期望的,但是如果确实发生了,我们将不得不重新考虑代码的许多其他部分以及这一部分。 对于您感兴趣的人,可以使用Java Reflection按名称调用类: Payment payment = getPaymentFromSomewhere(); try { String …

2
“可能”和“不太可能”宏的使用量太多了?
通常称为likely和的unlikely宏可帮助编译器了解if通常是要输入还是要跳过的。使用它可以带来一些(而不是很小的)性能改进。 我最近开始使用它们,我不确定应该多久使用一次此类提示。我目前将其与错误检查ifs 配合使用,通常将其标记为unlikely。例如: mem = malloc(size); if (unlikely(mem == NULL)) goto exit_no_mem; 看起来还可以,但是错误检查if经常发生,因此使用了所述宏。 我的问题是,是不是太有likely和unlikely宏的每个错误的检查if? 当我们在这里时,他们经常在其他什么地方使用? 在我当前的用法中,它位于从实时子系统进行抽象的库中,因此程序可以在RTAI,QNX和其他程序之间移植。也就是说,大多数功能都很小,可以直接调用一个或两个其他功能。许多甚至是static inline功能。 因此,首先,它不是我可以描述的应用程序。“识别瓶颈”是没有意义的,因为它是一个库,而不是一个独立的应用程序。 其次,有点像“我知道这不太可能,我不妨告诉编译器”。我没有积极尝试优化if。

2
“清洁代码”实践真的那么清洁和有用吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我目前在一家大公司实习,他们的软件交付结构正在发生许多变化(迁移到敏捷)。 在过去的几个月中,我注意到这种对Clean Code实践的宗教依恋,而这本书 对于开发人员来说就像一本圣经。 现在,干净代码的最重要特征之一是自解释代码,它基于可理解的命名和严格的重构。这是no commenting规则。 我知道这段干净的代码是一项长期投资,可以减轻代码维护和改进的负担,但是...这真的值得大惊小怪吗? 任何人都可以分享他们在“清洁法规”方面的经验以及任何意见,无论我是太保守还是只是暂时的趋势。

6
哪个更易于维护-通过if / else或布尔表达式进行布尔赋值?
哪个将更易于维护? if (a == b) c = true; else c = false; 要么 c = (a == b); 我尝试在“代码完成”中查找,但是找不到答案。 我认为第一个更具可读性(您可以从字面上大声读出来),我也认为这使其更易于维护。第二个当然更有意义并减少了代码,但是我不确定它对于C#开发人员是否可维护(我希望在Python中会更多地看到这种用法)。

4
我会遭受封装使用过度的困扰吗?
我在各种项目的代码中注意到了一些东西,这些东西似乎让我感到代码难闻,有些事情要做,但我无法解决。 在尝试编写“干净的代码”时,我倾向于过度使用私有方法,以使我的代码更易于阅读。问题在于代码确实更干净,但是测试起来也更加困难(是的,我知道我可以测试私有方法...),总的来说,这对我来说是个坏习惯。 这是一个类示例,该类从.csv文件中读取一些数据并返回一组客户(另一个具有各种字段和属性的对象)。 public class GroupOfCustomersImporter { //... Call fields .... public GroupOfCustomersImporter(String filePath) { this.filePath = filePath; customers = new HashSet<Customer>(); createCSVReader(); read(); constructTTRP_Instance(); } private void createCSVReader() { //.... } private void read() { //.... Reades the file and initializes the class attributes } private void readFirstLine(String[] inputLine) …

8
平衡信息异常和干净代码的好方法是什么?
使用我们的公共SDK,我们倾向于提供非常有用的消息,说明为什么发生异常。例如: if (interfaceInstance == null) { string errMsg = string.Format( "Construction of Action Argument: {0}, via the empty constructor worked, but type: {1} could not be cast to type {2}.", ParameterInfo.Name, ParameterInfo.ParameterType, typeof(IParameter) ); throw new InvalidOperationException(errMsg); } 但是,由于倾向于将重点放在错误消息而不是代码在做什么,这往往会使代码流变得混乱。 一位同事开始重构一些引发如下异常的异常: if (interfaceInstance == null) throw EmptyConstructor(); ... private Exception EmptyConstructor() …

6
最佳实践布尔分配
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我在另一个开发人员接手的程序中遇到以下条件: if (obj.Performance <= LOW_PERFORMANCE) { obj.NeedsChange = true; } else { obj.NeedsChange = false; } 我相信这段代码是多余的和丑陋的,因此我根据比较将其更改为我认为是简单的布尔分配: obj.NeedsChange = obj.Performance <= LOW_PERFORMANCE; 看到此消息后,查看我的代码的人评论说,尽管我的更改在功能上是正确的,但可能会使其他人困惑。他认为使用三元运算符可以使此分配更加清晰,而我不喜欢添加更多的冗余代码: obj.NeedsChange = (obj.Performance <= LOW_PERFORMANCE) ? true : false; 他的理由是,如果这样做会使另一个开发人员不得不停下来并确切地想出自己所做的事情,那么以最简洁的方式做某事是不值得的。 真正的问题是,这三种为布尔值赋值的方法中哪一种obj.NeedsChange最清晰,最可维护?

4
这种调用函数的方式不好吗?
我有以下代码: public void moveCameraTo(Location location){ moveCameraTo(location.getLatitude(), location.getLongitude()); } public void moveCameraTo(double latitude, double longitude){ LatLng latLng = new LatLng(latitude, longitude); moveCameraTo(latLng); } public void moveCameraTo(LatLng latLng){ GoogleMap googleMap = getGoogleMap(); cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, INITIAL_MAP_ZOOM_LEVEL); googleMap.moveCamera(cameraUpdate); } 我认为通过这种方式,例如,我消除了了解LatLng另一门课中的内容的责任。 而且,您无需在调用函数之前准备数据。 你怎么看? 这种方法有名称吗?真的是不好的做法吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.