Questions tagged «coding-style»

编码样式是一组准则,有助于提高可读性和对源代码的理解。

15
我应该继续自己的自学编码实践还是学习专业的编码方法?[关闭]
最近,我一直在从事专业工作,与其他程序员一起闲逛,并结交业界朋友。唯一的是我是100%自学的。这使我的风格与经过适当培训的人的风格极为不同。不同之处在于我的代码的技术和组织。 这是我做的几件事的混合体。我倾向于将几种编程范例融合在一起。像Functional和OO。我比OO更倾向于功能性方面,但是当某些东西作为抽象实体更有意义时,我会看到使用OO。就像游戏对象。接下来,我也会在做某事时走简单的路线。相反,有时候,我从专业程序员那里看到的代码似乎很复杂!我使用很多闭包。最后,我不是最好的评论者。我发现仅阅读我的代码比阅读注释要容易。大多数情况下,即使有注释,我最终还是要阅读代码。另外,有人告诉我,由于我编写代码的方式非常简单,因此很容易阅读。 我听到受过专业训练的程序员不断进行诸如单元测试之类的事情。我以前从未用过的东西,所以我什至都没有关于它们是什么或它们如何工作的最模糊的想法。下划线“ _”很多,这并不是我真正的品味。我使用的大多数技术都是直接来自我的,或者是我读过的几本书。对MVC一无所知,尽管我曾经听说过很多关于main.js的内容。我认为这是组织应用程序的一种方式。尽管这使我感到困惑,因为到目前为止我已经建立了自己的组织结构。 有点痛苦。当学习Ubuntu的Quickly之类的新知识时,我根本无法使用模板应用程序。我很难理解我可以告诉别人的代码。完整的OO编程确实给我留下了不好的印象,但这似乎是其他所有人严格使用的东西。 这让我对代码的外观没有那么自信,或者想知道我加入公司或为开源项目做贡献时是否会引起火花。实际上,我非常害怕人们最终会签出我的代码。这是任何程序员都可以正常进行的事情,还是我真的应该改变自己的技术?

8
条件中的条件条件分配是一种不良习惯吗?
假设我想编写一个在C中连接两个字符串的函数。我的编写方式是: void concat(char s[], char t[]){ int i = 0; int j = 0; while (s[i] != '\0'){ i++; } while (t[j] != '\0'){ s[i] = t[j]; i++; j++; } s[i] = '\0'; } 但是,K&R在他们的书中以不同的方式实现了它,尤其是在while循环的条件部分中尽可能多地包括: void concat(char s[], char t[]){ int i, j; i = j = 0; while (s[i] …

3
这是象征性的不断过度使用吗?
我刚接触软件工程,因此作为一项学习练习,我写了一个国际象棋游戏。我的朋友看了一下,并指出我的代码看起来像 for (int i = 0; i < 8; i++){ for (int j = 0; j < 8; j++){ 他坚持认为应该改为 for (int i = 0; i < CHESS_CONST; i++){ for (int j = 0; j < CHESS_CONST; j++){ 带有一些更好的符号名称,我现在就不用考虑了。 现在,我当然知道通常会避免使用幻数,但是我觉得 这个数字永远不会改变; 该名称无论如何都不能这么具有描述性,因为在整个代码中很多地方都使用了该数字;和 任何经过国际象棋程序源代码的人都应该对国际象棋有足够的了解,以便知道8是什么, 确实不需要符号常量。 那么你们怎么看?这是矫kill过正吗,还是我应该遵循惯例并使用符号?

15
源代码中毫无意义的代码
我从高级编码员那里听到了一些故事,而我自己也看到了一些。似乎有许多以上的程序员在编写无意义的代码。我会看到类似的东西: 没有价值的方法或函数调用。 在单独的类文件,对象或方法中进行的冗余检查。 if 始终为true的语句。 分离的线程不执行任何操作。 仅举几个。有人告诉我,这是因为程序员想要故意使代码混乱,以至于给组织增加自己的价值,或者确保在进行承包或外包工作时要重复业务。 我的问题是。其他人看到过这样的代码吗?您的结论是为什么存在该代码? 如果有人写过这样的代码,可以分享原因吗?

4
我是否应该对常数全部使用大写?
我是一名Python程序员,主要使用pylint整理源代码。我可以消除除以下警告以外的所有警告:常量名称无效。将名称更改为全部大写可以解决此问题,但是我真的应该这样做吗?如果这样做,我发现我的代码看起来很丑陋,因为大多数变量都是常量(根据pylint)。

5
我应该通过参数还是通过返回值初始化C结构?[关闭]
我工作的公司正在通过初始化函数来初始化所有数据结构,如下所示: //the structure typedef struct{ int a,b,c; } Foo; //the initialize function InitializeFoo(Foo* const foo){ foo->a = x; //derived here based on other data foo->b = y; //derived here based on other data foo->c = z; //derived here based on other data } //initializing the structure Foo foo; InitializeFoo(&foo); 我遇到了一些尝试初始化我的结构的问题: …

8
在这里抛出异常是一种反模式吗?
代码审查后,我刚刚讨论了设计选择。我想知道您的意见是什么。 有一个此类Preferences,它是键-值对的存储桶。空值是合法的(这很重要)。我们希望某些值可能尚未保存,并且我们希望通过在请求时使用预定义的默认值对其进行初始化来自动处理这些情况。 讨论的解决方案使用以下模式(注意:显然,这不是实际的代码-出于说明目的而进行了简化): public class Preferences { // null values are legal private Map<String, String> valuesFromDatabase; private static Map<String, String> defaultValues; class KeyNotFoundException extends Exception { } public String getByKey(String key) { try { return getValueByKey(key); } catch (KeyNotFoundException e) { String defaultValue = defaultValues.get(key); valuesFromDatabase.put(key, defaultvalue); return defaultValue; } …

10
将成员变量作为方法参数传递
在一个项目中,我发现了这样的代码: class SomeClass { private SomeType _someField; public SomeType SomeField { get { return _someField; } set { _someField = value; } } protected virtual void SomeMethod(/*...., */SomeType someVar) { } private void SomeAnotherMethod() { //............. SomeMethod(_someField); //............. } }; 我如何说服我的队友这是错误的代码? 我相信这是不必要的并发症。如果已经有成员变量,为什么还要将其作为方法参数传递呢?这也违反了封装。 您还发现此代码还有其他问题吗?

8
Java中哪种样式更好(实例变量与返回值)
当我需要在类中的某些方法中使用公共数据时,我常常会努力决定要使用这两种方法中的哪一种。有什么更好的选择? 在此选项中,我可以创建一个实例变量,以避免必须声明其他变量,并且避免定义方法参数,但是可能不清楚在哪里实例化/修改这些变量: public class MyClass { private int var1; MyClass(){ doSomething(); doSomethingElse(); doMoreStuff(); } private void doSomething(){ var1 = 2; } private void doSomethingElse(){ int var2 = var1 + 1; } private void doMoreStuff(){ int var3 = var1 - 1; } } 还是只是实例化局部变量并将其作为参数传递? public class MyClass { MyClass(){ int var1 …

10
如果可以使用后者,那么“父项x = new Child();”而不是“ Child x = new Child();”是一种不好的做法吗?
例如,我看过一些代码创建了这样的片段: Fragment myFragment=new MyFragment(); 它声明一个变量为Fragment而不是MyFragment,MyFragment是Fragment的子类。我对这行代码不满意,因为我认为该代码应为: MyFragment myFragment=new MyFragment(); 哪个更具体,是真的吗? 还是概括地说,使用以下做法是错误的做法: Parent x=new Child(); 代替 Child x=new Child(); 是否可以在没有编译错误的情况下将前一个更改为后一个?

8
即使我没有发生舍入错误,比较浮点数的相等性是否也会误导初级开发人员?
例如,我想显示一个从0,0.5,... 5开始的按钮列表,每0.5跳一次。我使用for循环来做到这一点,并在按钮STANDARD_LINE上使用了不同的颜色: var MAX=5.0; var DIFF=0.5 var STANDARD_LINE=1.5; for(var i=0;i<=MAX;i=i+DIFF){ button.text=i+''; if(i==STANDARD_LINE){ button.color='red'; } } 在这种情况下,应该没有舍入错误,因为每个值在IEEE 754中都是准确的。 var MAX=10; var STANDARD_LINE=3; for(var i=0;i<=MAX;i++){ button.text=i/2.0+''; if(i==STANDARD_LINE/2.0){ button.color='red'; } } 一方面,原始代码更加简单并转发给我。但是我正在考虑一件事:i == STANDARD_LINE是否误导了初级队友?它是否掩盖了浮点数可能具有舍入误差的事实?阅读这篇文章的评论后: https://stackoverflow.com/questions/33646148/is-hardcode-float-precise-if-it-can-be-represented-by-binary-format-in-ieee-754 似乎有很多开发人员不知道某些浮点数是准确的。即使在我的情况下有效,我是否应该避免浮点数相等性比较?还是我在考虑这个问题?

3
错误处理注意事项
问题: 长期以来,我对这种exceptions机制感到担心,因为我觉得它并不能真正解决应有的问题。 要求:关于该主题的争论很长时间,而且大多数人都在努力比较exceptions和返回错误代码。这绝对不是这里的主题。 尝试定义错误,我同意Bjarne Stroustrup和Herb Sutter的CppCoreGuidelines 错误表示该功能无法实现其广告目的 要求:该exception机制是用于处理错误的语言语义。 要求:对我来说,没有“没有借口”的功能不能完成任务:要么我们错误地定义了前后条件,所以该功能无法确保结果,或者某些特殊情况对于花时间在开发上没有足够重要的意义。一个办法。考虑到IMO,常规代码和错误代码处理之间的区别(在实施之前)是非常主观的。 要求:使用异常指示何时不保留前置条件或后置条件是该exception机制的另一个目的,主要是用于调试目的。我的目标不是这里的用法exceptions。 在许多书籍,教程和其他资料中,它们倾向于将错误处理显示为一门相当客观的科学,可以解决这一问题,exceptions而您只需要catch它们具有强大的软件就可以从任何情况下恢复。但是,作为开发人员的几年时间使我从另一种方法来看问题: 程序员倾向于通过抛出异常来简化他们的任务,而这种特殊情况似乎太少而无法仔细实现。典型的情况是:内存不足问题,磁盘已满问题,文件损坏等,这可能就足够了,但并不总是从体系结构级别决定。 程序员往往不会仔细阅读有关库中异常的文档,并且通常不知道函数何时何地抛出。而且,即使他们知道了,他们也并没有真正管理它们。 程序员往往没有足够早地捕获异常,当他们捕获异常时,主要是记录并抛出更多异常。(请参阅第一点)。 这有两个结果: 经常发生的错误可以在开发的早期发现并进行调试(很好)。 罕见的异常无法管理,并且会使系统在用户家崩溃(带有一条漂亮的日志消息)。有时会报告错误,甚至不会报告。 考虑到这一点,海事组织错误机制的主要目的应该是: 在不管理某些特定情况的代码中使可见。 发生这种情况时,将问题运行时与相关代码(至少是调用方)进行通信。 提供恢复机制 exception语义作为错误处理机制的主要缺陷是IMO:很容易看到a throw在源代码中的位置,但是绝对不明显,通过查看声明来知道特定功能是否会抛出。这带来了我上面介绍的所有问题。 该语言不会像对语言的其他方面(例如强类型的变量)那样严格执行和检查错误代码 尝试解决方案 为了改善这一点,我开发了一个非常简单的错误处理系统,该系统试图使错误处理的重要性与普通代码相同。 这个想法是: 每个(相关)功能都接收到对success非常轻的对象的引用,并可能将其设置为错误状态。在保存文本错误之前,该对象非常轻。 如果提供的对象已经包含错误,则鼓励函数跳过其任务。 绝对不能覆盖错误。 完整的设计显然会全面考虑每个方面(约10页),以及如何将其应用于OOP。 Success该类的示例: class Success { public: enum SuccessStatus { ok = 0, // All is fine error = 1, // …

3
代码缩进的起源
我有兴趣了解谁引入了代码缩进,以及引入的时间和地点。 对于代码理解来说,这似乎至关重要,但这并不是通用的。大多数Fortran和Basic代码是缩进的(?),Cobol也是如此。 我敢肯定,我什至看到过旧的Lisp代码都写成连续的,换行的文本。您只需要在脑子里数一下括号就可以解析它,不要介意理解它。 那么,如此巨大的进步从何而来呢?我从未见过有关其起源的任何提及。 除了使用它的原始示例外,我还在寻找有关缩进的原始讨论。

7
何时应在诸如KeyValuePair之类的预构建结构上使用2属性类?
什么时候应该将键/值类型的数据放在其自己的类中,而不是使用诸如a KeyValuePair或a 之类的预构建通用结构Tuple? 例如,我创建的大多数ComboBox都包含一个DisplayName和一个Value。这是我要决定何时放入新类以及何时仅使用KeyValuePair的数据类型。 我目前正在使用进行某些操作,iCalendar最终将所选用户的数据合并为一种key1=value1;key2=value2;字符串。我首先将数据放入KeyValuePair<string,string>,但现在我想知道那是否应该是它自己的类。 总的来说,我很想知道在决定使用现有的结构/类(如KeyValuePair2属性对象)时使用什么准则,以及在哪种情况下您应该使用哪种准则。
31 c#  coding-style 

4
魔术字符串/数字的用法
这是一个颇具争议的话题,我想与程序员一样多。但是,为此,我想知道业务(或您的工作场所)中的常见做法。 在我的工作场所,我们有严格的编码准则。其中一部分专门用于魔术字符串/数字。它指出(对于C#): 除了定义符号常量外,请勿在代码中使用数字或字符串的文字值。使用以下模式定义常量: public class Whatever { public static readonly Color PapayaWhip = new Color(0xFFEFD5); public const int MaxNumberOfWheels = 18; } 有例外:几乎可以始终安全地使用值0、1和null。通常,值2和-1也可以。用于记录或跟踪的字符串不受此规则的限制。当文字的含义在上下文中很清楚且不受将来的更改时,允许使用文字。 mean = (a + b) / 2; // okay WaitMilliseconds(waitTimeInSeconds * 1000); // clear enough 理想的情况是在以下情况下一些官方研究论文对代码的可读性/可维护性产生影响: 魔术数字/字符串无处不在 魔术字符串/数字会被常量声明合理地替换(或在不同程度的覆盖范围内)-请不要因为使用“合理地”而对我大喊大叫,我知道每个人都有不同的想法,“合理地”是什么 魔术字符串/数字被多余地替换在不需要的地方(请参见下面的示例) 在与一位同事争论时,我希望这样做具有一些基于科学的论据,而后者将要声明常量,例如: private const char SemiColon = ';'; private …

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.