代码的风格

centos7环境下frp源码编译及404页面修改教程 前言 frp 是一个高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务,支持 TCP、UDP、HTTP、HTTPS 等协议类型,并且 web 服务支持根据域名进行路由转发。 Github: https://github.com/fatedier/frp 当然frp作者已经提供多达20种已编译好的各种版本可以供大家使用,几乎不需要自己编译。 但是有时候我们需要自定义一些内容,这... 阅读详情

 

 

Code Style

代码的风格

 

1.        简介

2.        什么是风格?

3.        代码的风格为什么如此重要?

4.        更少的工作,更多的文档?

5.        推荐的代码风格

6.        简单的文档

7.        输出风格

8.        结论

 

简介

让我们面对一下吧…如果您是一个资深的程序员,那么您总是在最后期限下工作并且您的最终目标是完成您设计的软件。如果您是个新手,您的努力是更多的研究、试验、当然还有错误和一心希望您的程序可以象打算的那样运行。不管怎样,当您的程序真的如愿以偿的运行时那种成功的感觉令人十分振奋,但更多的程序员发现能够用良好的风格生成程序内部代码时的那种自豪的感觉更棒。

如果您是程序设计小组的成员或者如果您还在书写学校分配的任务,那么您会有机会被要求遵守某些必须遵守的风格规则。 绝大多数的程序员考虑风格这件事就象一个10岁大的孩子看待就寝时间一样。但资深程序员和我所见过的小组领导及多年来使用许多风格的程序员都会试图向您传达良好的代码风格与您所得意的一些书写代码的技巧同样重要。在这篇文章中我将尝试包括一些输出风格的观点,这也许有助您的编程旅程。

 


更少的工作,更多的文档?

因此风格意味着要在代码的每一行加上注解,对吗?错。如果没有做对的话,注解也会变成一场灾难。 我仍然希望一个程序员学会喜欢输入注解或真正对注解有足够的重视。为了未来的可维护性必须强制自己正确的放置注解。所以怎么能够不使用注解?

显然对一个新手最困难的事是懂得什么是好的变量命名。让我们看看以下的代码。您能告诉我下面的代码是做什么的吗?

                    float __fastcall TExampleForm::CalcAverageGrade(void)
               {
            int y=0;
            int i=0;
            for (i; i<x; i++) { 
                    y=y+g[i];        
               }
            return float(y/x);
                    }

 在上面的例子中,您能很轻易的告诉我y代表什么呢?x又是什么呢?这段代码也许需要一些注释来解释这些变量的代表意义及代码中发生了什么?应用以上的代码风格,看不出什么逻辑关系。现在让我们看看应用更好的代码风格以后,代码是何等模样?

                    float __fastcall TExampleForm::CalcAverageGrade(void)
               {
            int total=0;
            for (int i=0; i<maxGrades; i++) 
                    {
                    total+=Grades[i];
               } //求所有成绩的和
 
            return float(total/maxGrades);
               } //计算平均成绩

在您除错时以上两段代码孰优孰劣,已不必多说。现在就让我们讨论一些能够让您的代码更具有可维护性的推荐风格吧。


推荐的代码风格

1.     使用有描述意义的变量名。

2.     使用i, j, k, l, m作为循环计数变量。这起源于Fortran,自始自终这都是事实上的工业标准。

3.     在闭合括号处为所有的声明和方法注释。这样在尝试找到与此配对的上一个初始括号时更容易做决定,尤其在声明很长时。

4.     考虑将if后面或循环定义体的初始括号放在一个单独的行上。这真的有助于您找到与其对应的闭合括号。

5.     使用适当的组合运算符 (+=, *=, 等等)。对自增(自减)变量使用++ 和 -–运算符。正确使用这些运算符会使您的代码更可读和更一致。这也减少了输入的字符数量。组合运算符也会帮助编译器生成更快的代码。举例来说,i++产生的asm(汇编)代码是inc [i],而i=i+1将会产生如下的asm(汇编)代码mov eax,[i] inc eax mov [i],eax。

6.     注解代码时,要明智些!如果一段代码的逻辑关系很复杂,注解将有助于别人理解代码的意图。但如果逻辑关系直线向前,避免加上并非必须的注解。要象维护您的代码一样维护您的注解!

7.     命名变量时,使用有描述意义的大写。简单变量(例如,int, long, String)应该以小写字符开始。复杂变量(例如,对象、结构、数组)应该以大写开始。变量名称中包含的所有单词都应该大写开头。这会让读(写)代码的人对所访问的数据类型有一个清晰的第一印象。

8.     避免在变量名中使用下划线。绝大多数的编译器中,它都有特殊的意义。

9.     尽可能(而不是疯狂的)将代码模块化。合理的话,将代码放入函数中去。这允许更好的代码重用性和可读性。

10. 使用正确的循环。如果代码最少要执行一次,使用do-while循环,否则使用while-do循环。如果确切的循环执行次数已知,使用for循环。

11. 在事件发生的数量超过两种时,只要可能就使用switch声明。同时,无论何时只要可能就包含一个switch default(缺省开关),这样总会有一个选项被触发。Switch声明很容易除错,而且比组合的多重if声明执行速度更快。

12. 在您代码中的逻辑步骤之间加上一个空行(例如,定义变量、循环、等等)。

13. 声明变量的位置非常重要。变量应该声明的位置几乎没有随意性。当变量用于整个(类)对象或者必须在对象外可见的时候,变量应放在头文件中。临时变量如果不需要在if声明或循环体外被访问的话,就应在它们内部声明。不正确的放置变量声明会导致执行速度减慢、错误、或者引起误导的代码。

14. 初始化所有的变量。

15. 如果您有非空返回(带返回值)的函数,确保所有的退出点都使用了return。对编译器产生的警告"function should return a value"(函数应该返回一个值)要引起足够重视。这是严重警告并且可能导致您的软件发生随机错误。

16. 在两个不同类型的变量间赋值时,应对变量进行强制转换计算来避免编译器的警告(例如:int x; float y; … y=float x;)。这么做可以防止"Conversion may loose significant digits"的警告。作为一个程序员您的目标应该尽可能的减少警告的数量。而强制类型转换将消除其中的大多数。

17. 永远在删除后将指针设为NULL。

18. 尽量仔细的调查以避免“闭门造旧车”。经过证明的函数与程序使用时优先于新写的代码。这会让您有更多的时间去写真实的逻辑代码并且非常有助于维护。尽管尽管动态链表的书写非常有趣,它早已被完成了!

19. 正确的拼写很重要。如果拼写有错的话,将来的搜索会很困难。

20. 永远不要使用两个只有大小写不同的变量名字。

21. 在您创建代码时就输入注解,而不是以后。在您修改代码的时候,保持对注解的维护。

22. 如果您在调试或除错时注解(rem)了一段代码的话,确保您最后将被注解的代码删除。

23. 最后最重要的是…保持风格的一致。

 

 简单的文档

 平凡的文档在创建一个可维护的系统是却十分有效。您应该设置一个标准来为您的文档注解模板规定文件的开始处应该放置的内容。这里是某些应该在您的模板中完成的东西:

1.          原创作者名字

2.          原始创建日期

3.          文件的用途

4.          包括使用指导在内的主要内容列表

5.          包括修订日期的修订历史记录。同时应该说明修订时发现并修复的bug。

文件注解应该放在文档头部,并尽量简明。下面是我们现在的应用程序的一个例子。这个例子比较复杂。

/*

Written by(作者): Scott Cross               

Date originally Completed(原始完成日期): 9/18/99

Purpose(用途): Main routine for NY Billing. This logic calculates the installments and provides all data necessary to print, display, and report billing status. The form will display the billing information. The main structure, InvoiceInfo, has all information including detail of Installments and Payment activities. Although the main object is a form, the form need not be shown in order to get billing information. This is the only billing logic for this version of the system. All billing inquiries should go through this routine.

Usage(用法): Nothing will be performed during the OnCreate event with the exception of setting some reference variables. All calculations are done by calling the main routine LoadAcctInfo. This routine can be called many times for different policies since it is fully initialized on each call. There are 5 parameters for the main functions and their usage is as follows:

bool LoadAcctInfo(     

    String policyNo - Supplies the logic with the targeted PolicyNo.         
    bool printInvoice - Set to true if you want to print the invoice.        
    bool nightRunning - If being called from the night, set to true.         
    bool payableRunning - If being called by accounting rpt, set to true.       
    String masterPrintDate - This is a date. For more info on usage, see cpp.       
    );

No preliminary logic needs to be performed and the function will return true in most cases. No structures are passed since the main structure is public. It is imperative that the LoadAcctInfo be called prior to displaying the screen or unexpected results can occur since the main structures will not be initialized.

struct InvoiceInfoStruct{     
    PaymentHistoryStruct Payments[30]; - Payment History     
    int paymentCount; - Count of Payments    
    InstallmentStruct Installments[30]; - Installment Information     
    int installmentCount; - Count of Installments    
    int currInstall; - The current due installment    
    float totalPaid; - The total paid on file *    
    float totalDue; - Total due on file    
    float pastDue; - Total amount past due    
    float totalBilled; - Total amount billed on file    
    float totalApplied; - Amount applied to installments **     
    String equityDate; - The date the premium is paid to     
    String dateDue; - Date the file is due a payment    

    float annualizedPremium; - the annualized premium ***     
    };

* Restricted to masterPrintDate
** Should equal total paid
*** What the annualized premium is for the policy as stored in the tables if rated for one year.

Update History(更新历史):
09/18/1999 - Scott - Completed
02/01/2000 – Scott - Fixed totalPaid error on cancelled file
*/

 输出风格

输出风格没有标准。在我的观念中,编程最精彩的部分是程序的设计。您可以有自己的选择,从什么是好的或坏的直到系统的外观和感觉。尽管如此,仍有些有助于您的设计的建议。

1.    选择统一的字体。

2.    把界面设计成可以在不同分辨率和不同设置下正常工作。启用/不用大字体,然后测试您的软件。并假定用户仍在windows的VGA设定下运行(640X480 16色)。

3.    在多种颜色方案下测试软件。

4.    尝试维护逼真的3D效果。大多数情况下,初始的form(页面)应该是凸起的并带有一种附加的下凹效果。尽管这看起来有点小儿科,但这使得程序有了深度并非常有助于分割页面。

5.    牢记输出效果的性能。在处理器集中的循环中,更新越简单,执行就越快。

6.    尽量避免在界面中使用太多的噱头组件和效果。这会给人不专业的感觉,也可能伤害用户的信心,除非工程要求浮华的设计。

7.    设计登录屏幕,让用户无须鼠标动作就可以获得更多。

8.    您的用户也许欣赏毫不杂乱的环境,但也要牢记这依靠用户的配置,多屏可能会使系统太慢。尝试在速度和可用性之间找到平衡吧。

9.    在任何时候使用弹出提示和提示条都是合适的。从一开始就就记住要将页面设置成这样的。

10.  向导类型的界面对复杂的多步骤过程时十分合适。这使得软件可以指导用户一步步的走过这些步骤。找一个好的NoteBook(笔记本)组件吧。

11.  在进行长时间的操作时,应该总是调用Application->ProcessMessages();保持界面更新并让windows知道您的应用程序仍然处于活动状态且能够响应消息。

12.  最后最重要的是…保持系统风格的一致。


 

结论

编程的风格要比许多程序员想像的更重要的多。您想让别的程序员看见您现在的工程中的代码吗?您是不是对您的代码和您的系统一样自豪呢?现在花点时间来决定想在您的代码中采用何种风格并开始每天使用这种风格。记住,用6个星期来发展一个习惯,不管它是好的还是坏的。

祝 好运!

 

原著:  Scott Cross

翻译: cker


 

版权说明:

国内的网站上,有许多关于C++Builder的内容,但多以软件、组件为主。论坛里也大都不能令人满意,很空虚的感觉。书籍又都昂贵,内容却有抢钱之嫌。对银子不足的初学者、自学者关爱不够,因而想尽自己的绵薄之力。

文中的所有资料都是从国外网站上收集而来。因为E文不方便,所以翻成中文。又因为English和计算机都不是非常好,文中的错误在所难免。若大家觉得有用的话,我计划不断搜集翻译一些有用的东西。

有任何意见和建议请mailto:cker@sina.com

您可以随意复制、分发、下载此文档。但未经本人同意,您不可以截取、改动本文片断,或用本文谋取任何形式的利益。

 

史平洋

2001.2

40种常用差分格式的源代码(Fortran语言),附说明 40种常用差分格式的源代码(Fortran语言),附说明;适合CFD学习 立即下载

相关推荐

深入解析进化算法中的选择与多样性

在计算科学的世界里,最优雅的解决方案往往源于最古老的智慧——大自然。进化算法(Evolutionary Algorithms, EAs)正是这样一种受达尔文自然选择学说启发的强大工具。它们通过模拟“适者生存”的过程,在庞大的可能性海洋中搜寻最优解。。:指的是深入挖掘和优化已知的优质解。这就像在一片已知的沃土上精耕细作,力求获得最高产量。强大的选择压力会促进这一过程。:指的是在整个搜索空间中寻找全新的、可能更优的解。这好比派遣探险队去发现新大陆,充满了未知与机遇。保持种群的多样性是探索的关键。

weixin_62533513的博客 716

C语言的错误大全及中文解释

1: Ambiguous operators need parentheses — 不明确的运算需要用括号括起 2: Ambiguous symbol xxx — 不明确的符号 3: Argument list syntax error — 参数表语法错误 4: Array bounds missing — 丢失数组界限符 5: Array size toolarge — 数组尺寸太大

juyufeng_HuaZhu的博客 2819

停车位检测:基于YOLOv5与UI界面的实现

YOLOv5是YOLO(You Only Look Once)系列中的最新版本,它能够在单次前向传播中同时完成多个目标的定位与分类,因此被广泛应用于实时目标检测任务。与之前的版本相比,YOLOv5在精度和速度上得到了很大的优化,适合嵌入到实际的自动驾驶和智能交通系统中。YOLOv5使用了卷积神经网络(CNN)进行特征提取,并通过回归方法预测边界框、类别及置信度。高效的推理速度:YOLOv5采用了优化的模型结构,能够在保证精度的同时提供较快的推理速度。较高的精度。

YOLO 694

C语言常见错误翻译

Ambiguous operators need parentheses 不明确的运算,需要用括号括起来 Ambiguous symbol 'xxx' 不明确的符号 Argument list syntax error 参数表语法错误 Array bounds missing 丢失数组界限符 Array size too large 数组尺寸太大 Bad character in ...

酹江月的博客 1774

工业缺陷检测:基于深度学习的表面缺陷分类

工业缺陷检测:基于深度学习的表面缺陷分类 ,人工智能,计算机视觉,大模型,AI,在现代工业生产中,产品质量直接影响企业的竞争力和声誉,工业缺陷检测作为质量把控的重要环节,其技术的发展至关重要。传统的人工检测方式效率低、成本高且易受主观因素影响,难以满足大规模、高精度的生产需求。随着深度学习技术的蓬勃发展,基于深度学习的工业表面缺陷分类方法凭借强大的特征提取和模式识别能力,成为解决工业缺陷检测难题的有效途径。本文将深入探讨基于深度学习的工业表面缺陷分类技术,结合详细的代码示例和概念解析。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 3万+

Open3D点云数据处理(六):点云、mesh可视化(Visualizer类)

本文介绍了Open3D中Visualizer类可视化几何对象的方法,给出了常用参数解释和代码示例。

孙悟空 3025

【Fortran】代码风格

Fortran推荐代码风格

Sumbrella_的博客 1553

汽车IVI中控开发入门及进阶(九):显示屏

显示屏Display panel和触控屏Touch panel,可以说随着汽车四化的进展,屏越来越多,越来越大,越来越高清,成为IVI中控、智能座舱系统的重要组成部分。比如如下一个电阻触摸屏。正文:显示屏主要功能就是显示,车载内容和信息的传递全靠显示屏,目前车载显示屏的种类可以分为:LCD液晶显示屏(TFT(薄膜晶体管)驱动的有源矩阵液晶显示,再细分IPS、TFT、SLCD,这几个子类)、LED显示屏(用 LED发光二极管作为背光光源)、OLED 显示屏。

码农17年的博客 2526

Fortran 代码风格(转)

8. 推荐好的代码风格根据F90子集语言ELF90和F的要求整理(部分)。“强迫用”的语言特性:+ F90的自由格式的源代码。+ implicit none。+ 子过程的哑元都要有intent属性。+ 函数子程序的哑元必须指定为intent(in)。+ 所有子程序和函数都放在模块(module)中,然后引用(use)该模块;或者放在program中。+ 数组哑元要求是假定形状的,或者有固定的维数...

东躲西藏终有尽,但求十年不折腾 1474

6.4 直流无刷电机(BLDC):测试与性能评估

本文系统阐述了直流无刷电机(BLDC)的测试与性能评估方法,涵盖参数测量、性能测试、测试平台设计及可靠性评估。详细介绍了绕组电阻、电感和反电动势的测量原理与修正方法,以及转矩-转速特性、效率分析和动态响应测试的技术要点。通过搭建高精度测功机系统,结合自动化数据处理,实现对电机性能的全面评估。最后讨论了温升、振动、EMC等特殊测试方法,为BLDC电机的设计验证和质量控制提供了完整的技术路径。

技术工作者 442

PCL RANSAC拟合分割多条直线【2026最新版】

使用RANSAC算法拟合分割多条直线,输出每一条直线的拟合参数到控制台,并保存直线点云到本地文件夹。博客长期更新,本文最新更新时间为:2026年5月24日。

点云侠的博客 7974

今天给大家推荐36套404页面模板

404页面是网站必备的一个页面,它承载着用户体验与SEO优化的重任。当用户访问不存在的页面时,服务器会返回404错误代码,并显示404页面。一个好的404页面可以帮助用户快速找到所需信息,并提升网站的用户体验。希望这些示例和技巧能够帮助您设计出创意且实用的404页面!

二当家的 2008

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

有趣的404Error 页面。。。

今天偶尔看到个链接发现了各种有趣的404错误页面。 1.Bluedaniel2. Fryewiles3. Cuoma4. Tele25. Pen and Paper6. Pattern Tab7. We Function8. Po

kucool的专栏 1153

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

有趣的网站404错误设计欣赏

如果一个用户看到一个普通的404错误页面他或许不会多做一些停留。而如果一个有创造性的404页面它肯定会激发访客多做一些停留来研究这个页面。所以想让你的404页面多一些访客量停留那就在上面多一些创造性的空间。 今天站长素材专门收集了50个很有趣的404创意页面,里面有一些超越性的创意和添加动画的创意 页面。收藏着对你绝对不会后悔。   1. The Many Faces of

to_phper的专栏 759

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

android webview 自定义404错误页面!

自定义404页面。android的webview 控件可以加载网页,webview有两个方法:webView.setWebChromeClient和webView.setWebViewClient。 WebChromeClient主要处理解析,渲染网页等浏览器做的事情,辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度:    onCloseWindow(关

xiaonanxiatian的专栏 3386

jsp为什么错误页面不跳转_为什么别人家的 404 错误页面总是那么好看?

本文作者:井岛俊一编译:36氪,ID | wow36kr你肯定有过这种经历:看到一个非常感兴趣的超链接,点击后显示 404 页面无法访问。遇到这种情况,你的用户体验肯定会大打折扣。但是,这个 404 页面是否给了你什么其他信息?这些信息有用吗?它们会让你不再难过吗?你可以把 404 页面当作一个着陆页(landing page),虽然它可能是可以人人都不喜欢的着陆页。试想,假如这个错误页...

weixin_39827306的博客 420

经典网页设计:原来404错误页面可以这样设计

  404页面的目的是告诉浏览者其所请求的页面不存在或链接错误,同时引导用户使用浏览网站的其他页面而不是关闭网页离开。自定义404错误页面是增强用户体验的很好的做法,花时间去设计一个创意的404错误页...

QDY5945的博客 516

(Python网络爬虫);抓取B站404页面小漫画

一个网络爬虫的小案例,提供了多进程和异步版本的实现。

洞天察地,万物之理;物理人太难了! 8334

idea打开html页面显示404_网站404问题处理

404页面  今天为什么要说一下404问题呢,最近看case过程中发现个很有意思的网站,该网站被灌了大量的垃圾信息,被其发现后及时地进行了删除,这一点是值得肯定的。通常情况下,正常网站将自动返回404状态码,搜索引擎进行更新并删除,避免对网站用户及搜索引擎带来负面影响。但问题来了,该网站只删除了内容,没有任何主体内容的页面被保存了下来,未做404处理。当然,存在一类网站只删除内容后返回正常200状...

weixin_39849888的博客 3123

那些值得借鉴的的国外创意404错误页面设计

  在网上冲浪的时候碰到404错误页面是非常令人沮丧的,随后的一两秒内如果没有什么吸引你的注意力的话,我敢肯定你会离开网站,再也不会回来。因此,很多网站都会设计一个新颖的错误页面,以吸引用户继续浏览其...

setsunadoudou的博客 337

那些让人惊叹的的国外创意404错误页面设计

那些让人惊叹的的国外创意404错误页面设计   在网上冲浪的时候碰到404错误页面是非常令人沮丧的,随后的一两秒内如果没有什么吸引你的注意力的话,我敢肯定你会离开网站,再也不会回来。因此,很多网站都会设计一个新颖的错误页面,以吸引用户继续浏览其它的内容。这里收集了45个非常有创意的404错误页面设计作品,一起欣赏:)   1. Batman 2. Godzilla

灵动grace 784

两款好看的网站维护404页面源码

介绍: 两款网站维护404页面源码 网盘下载地址: https://zijiewangpan.com/oG36aJshbpk 图片:

php源码 704

飞翔鸟儿404页面源码

【代码】飞翔鸟儿404页面源码。

大新的博客 476

Vue单页及多页应用全局配置404页面实践记录

无论单页还是多页,我的实现思路是总体配置404页面的思路就是在前端路由表中添加一个 path: '/404' 的路由,渲染相应的404页面。这篇文章主要介绍了Vue单页及多页应用全局配置404页面实践,需要的朋友可以参考下 前后端分离后,控制路由跳转的责任转移到了前端,后端只负责给前端返回一个html文档以及提供各种接口。下面我们用作例子的两个项目,均采用vue作为基础框架,一个是SPA应用,另...

u010227042的博客 334
上一篇: 掌握C++Builder的除错艺术-第二篇(完整版)之二
下一篇: C++Builder和Delphi中的复活节彩蛋
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值