Questions tagged «coding-style»

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

5
函数返回字符串,风格好吗?
在我的C程序中,我经常需要一种方法来对我的ADT进行字符串表示。即使我不需要以任何方式将字符串打印到屏幕上,使用这种调试方法也很简洁。因此,经常会出现这种功能。 char * mytype_to_string( const mytype_t *t ); 我实际上意识到我在这里有(至少)三个选项来处理返回字符串的内存。 备选方案1:将返回字符串存储在函数的静态char数组中。除了每次调用都会覆盖该字符串外,我不需要太多思考。在某些情况下这可能是个问题。 备选方案2:使用函数内部的malloc在堆上分配字符串。真的很整洁,因为我那时无需考虑缓冲区的大小或覆盖的问题。但是,我确实必须记得在完成操作后将字符串free(),然后还需要分配一个临时变量,以便可以释放。然后堆分配实际上比堆栈分配要慢得多,因此如果在循环中重复进行,则将成为瓶颈。 备选方案3:将指针传递到缓冲区,然后让调用方分配该缓冲区。喜欢: char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen ); 这给呼叫者带来了更多的努力。我还注意到,该替代方案在参数顺序方面为我提供了另一个选择。我应该首先讨论哪个论点?(实际上有六种可能性) 那么,我该选择哪个呢?为什么?C开发人员中是否存在某种不成文的标准?


4
好的代码风格可在任何地方引入数据检查?
我有一个足够大的项目,我再也无法保持每个方面的头脑。我正在处理其中的许多类和函数,并且正在传递数据。 随着时间的流逝,我注意到我一直在出错,因为我忘记了将数据传递给不同的函数时数据必须具有的精确格式(例如,一个函数接受并输出一个字符串数组,另一个函数是我后来写的,接受保留在字典等中的字符串,因此我必须将正在使用的字符串从数组中的字符串转换为字典中的字符串)。 为了避免总是要弄清楚什么地方断了,我开始将每个函数和类都视为“孤立实体”,因为它不能依赖外部代码为其提供正确的输入,而必须自己执行输入检查(或,在某些情况下,如果数据格式错误,请重铸数据。 这大大减少了我花费在确保传递的数据“适合”每个函数上的时间,因为当某些输入不正确(有时甚至纠正)时,类和函数本身会警告我,而我不会必须与调试器一起遍历整个代码,以找出问题的根源。 另一方面,这也增加了整体代码。 我的问题是,此代码样式是否适合解决此问题? 当然,最好的解决方案是完全重构项目,并确保数据具有所有功能的统一结构-但是由于该项目不断增长,因此我最终将花费更多的时间并担心干净的代码,而不是实际添加新内容。 (仅供参考:我仍然是一个初学者,因此,如果这个问题太天真,请原谅;我的项目是使用Python。)

4
重做一个返回代表许多不同状态的整数代码的函数
我继承了一些糟糕的代码,其中包括以下简短示例。 这个特殊的反模式有名称吗? 有哪些重构建议? // 0=Need to log in / present username and password // 2=Already logged in // 3=Inactive User found // 4=Valid User found-establish their session // 5=Valid User found with password change needed-establish their session // 6=Invalid User based on app login // 7=Invalid User based on network …

5
将文本标记放在字符串中是否不好?有其他选择吗?
我使用大量字符串,需要大量操作。 例如,我可能会生成这样的字符串: 第1部分船 A节 编程 第2部分用于编程的分区船。 AA 节SQL条目。 该字符串太大,无法手动检查它的每个部分。现在,我需要split将此string分为stringlist几个部分。我可以想到两种选择: 正则表达式: QStringList sl = s.split(QRegularExpression("\n(?=Part [0-9]+|Section [A-Z]+)")); 看起来应该可以,但是有时会漏掉一些异常(即:Section SQL Entries错误地分裂) 否则,我可以做的就是在生成初始字符串时放置一个标记: 🚤💻Part1 船 AA节 编程 🚤💻第2部分用于编程的分区船。 A 第AA 节“ SQL条目”。 这意味着分割字符串将变得容易: QStringList sl = s.split("🚤💻")); 有人告诉我,这些都不是好的样式或编程实践,但是直到现在我还没有讨论它,也没有找到替代方法。 如果您是我的项目经理,您会接受这两种方法吗? 如果没有,您会建议我做为最佳做法吗?

3
成员:使用唯一ID与域对象
在关于是否应将域对象或唯一ID作为方法/函数参数(此处将标识符与域对象用作方法参数)使用几个有用的答案之后,我有一个类似的问题:成员(先前的讨论没有设法解决)盖上这个)。使用唯一ID作为成员与使用对象作为成员的优缺点是什么。我要问的是强类型语言,例如Scala / C#/ Java。我应该有(1) User( id: Int, CurrentlyReadingBooksId: List[Int]) Book( id: Int, LoanedToId: Int ) 或(2),而不是(1)经历之后:是否应该为所有内容定义类型? User( id: UserId, CurrentlyReadingBooksId: List[ BookId] ) Book( id: BookId, LoanedToId: UserId ) 或(3) User( id: Int, CurrentlyReadingBooks: List[Book]) Book( id: Int, LoanedTo: User) 虽然我没有想到拥有对象(3)的好处,但是拥有ID(2)和(1)的好处之一是,当我从数据库创建User对象时,不必创建Book对象,可能反过来取决于User对象本身,从而创建了一个无尽的链。对于RDBMS和No-SQL(如果它们不同)是否有通用的解决方案? 根据到目前为止的一些答案,改写我的问题:(使用ID应该是包装类型的ID)1)始终使用ID?2)总是使用对象?3)在序列化和反序列化存在递归风险时使用ID,否则使用对象吗?4)还有什么? 编辑:如果您回答应始终使用对象或在某些情况下使用对象,请确保回答其他回答者已发布的最大问题=>如何从数据库获取数据

4
函数中内部作用域块的使用是否不好?
在某些(非常罕见)的情况下,存在以下风险: 重用不打算重用的变量(请参见示例1), 或使用一个变量代替另一个在语义上接近的变量(请参见示例2)。 范例1: var data = this.InitializeData(); if (this.IsConsistent(data, this.state)) { this.ETL.Process(data); // Alters original data in a way it couldn't be used any longer. } // ... foreach (var flow in data.Flows) { // This shouldn't happen: given that ETL possibly altered the contents of `data`, it is …

3
依靠隐式参数转换是否被认为是危险的?
C ++具有一项功能(我无法弄清楚它的正确名称),如果参数类型不是期望的参数类型,它将自动调用参数类型的匹配构造函数。 一个非常基本的示例就是调用一个std::string带const char*参数的函数。编译器将自动生成代码以调用适当的std::string构造函数。 我想知道,它是否像我认为的那样对可读性不利? 这是一个例子: class Texture { public: Texture(const std::string& imageFile); }; class Renderer { public: void Draw(const Texture& texture); }; Renderer renderer; std::string path = "foo.png"; renderer.Draw(path); 这样好吗 还是太过分了?如果我不应该这样做,我可以以某种方式让Clang或GCC发出警告吗?

7
临时变量与线长要求
我一直在阅读Martin Fowler的Refactoring。它通常很棒,但是Fowler的建议之一似乎引起了一些麻烦。 Fowler建议您使用查询替换临时变量,因此,不要这样做: double getPrice() { final int basePrice = _quantity * _itemPrice; final double discountFactor; if (basePrice > 1000) discountFactor = 0.95; else discountFactor = 0.98; return basePrice * discountFactor; } 您可以使用辅助方法: double basePrice() { return _quantity * _itemPrice; } double getPrice() { final double discountFactor; if (basePrice() > …

7
冗余检查条件是否不好?
我经常在代码中找到一些位置,一遍又一遍地检查特定条件。 我想举一个小例子:假设有一个文本文件,其中包含以“ a”开头的行,以“ b”开头的行以及其他行,而我实际上只想使用前两种行。我的代码看起来像这样(使用python,但将其读取为伪代码): # ... clear_lines() # removes every other line than those starting with "a" or "b" for line in lines: if (line.startsWith("a")): # do stuff elif (line.startsWith("b")): # magic else: # this else is redundant, I already made sure there is no else-case # by using clear_lines() …

4
如何避免抽象类的通用名称?
通常,最好避免将诸如“ handle”或“ process”之类的单词作为例程名称和类名称的一部分,除非您要处理(例如)文件句柄或(例如)unix进程。但是,抽象类通常并不真正知道它们除了处理之外还打算做什么。在当前情况下,我有一个“ EmailProcessor”,它可以登录到用户的收件箱并处理来自该收件箱的消息。尽管我注意到出现了以下样式问题,但我仍然不清楚如何给它一个更精确的名称: 更好地将派生类视为客户端,并通过其实现的功能的一部分来命名基类?给它更多的含义,但会违反is-a。例如,EmailAcquirer是一个合理的名称,因为它是为派生类获取的,但是派生类将不会为任何人获取。 或只是名字含糊不清,因为谁知道派生类将做什么。但是,“处理器”仍然过于笼统,因为它正在执行许多相关的操作,例如登录和使用IMAP。 摆脱这种困境有什么办法吗? 对于抽象方法,问题更加明显,在抽象方法中,您不能真正回答“这是做什么的”问题。因为答案仅仅是“客户想要的任何东西”。

4
如何保持连续性/回调的代码可读性?
简介:尽管使用了异步代码和回调,是否可以遵循一些完善的最佳实践模式来使代码保持可读性? 我正在使用一个JavaScript库,该库异步执行很多工作,并且严重依赖于回调。看来编写一个简单的“负载A,负载B ...”方法变得相当复杂,并且很难使用此模式进行操作。 让我举一个(人为的)例子。假设我要从远程Web服务器(异步)加载一堆图像。在C#/ async中,我将编写如下内容: disableStartButton(); foreach (myData in myRepository) { var result = await LoadImageAsync("http://my/server/GetImage?" + myData.Id); if (result.Success) { myData.Image = result.Data; } else { write("error loading Image " + myData.Id); return; } } write("success"); enableStartButton(); 代码布局遵循“事件流”:首先,禁用开始按钮,然后加载图像(await确保UI保持响应),然后再次启用开始按钮。 在JavaScript中,使用回调,我想到了这一点: disableStartButton(); var count = myRepository.length; function loadImage(i) { if (i …

8
那所有这些编码规则呢?
我一直支持为公司或特定项目的开发人员制定编码规则的想法。特别是如果公司的规模大于10。公司越大,需求越大。我知道很多人会不同意,但是我看到没有这些项目的项目,并且代码看起来像是彻底的灾难。 由此产生的真正问题是,如何使那些不喜欢在if语句中使用方括号,不喜欢在代码中到处使用相同的连接字符串的人,或者不使用编码规则而又不反对的人这个主意?

9
您如何找到,完善和维护您的编码风格?
最近,我一直在几个项目和开发环境之间切换。每种代码风格的期望都不同。 现在,我的问题分为三个部分,第一部分是出于好奇: 您如何定义和找到您的编码风格? 您如何不断扩大和改进它? 您如何保养它?(从心理笔记中,保存文档,使用StyleCop等工具。)

4
C ++处理大型模板实现的首选方法
通常,在声明C ++类时,最佳实践是仅将声明放入头文件中,并将实现放入源文件中。但是,这种设计模型似乎不适用于模板类。 在网上查找时,对于管理模板类的最佳方法似乎有两种意见: 1.标头中的整个声明和实现。 这相当简单,但是我认为,当模板变大时,很难维护和编辑代码文件。 2.将实现写入末尾包含的模板包含文件(.tpp)中。 对我来说,这似乎是一个更好的解决方案,但似乎并未得到广泛应用。是否存在这种方法不及格的原因? 我知道很多时候,代码风格是由个人喜好或传统风格决定的。我正在开始一个新项目(将旧的C项目移植到C ++),并且我对OO设计比较陌生,并且希望从一开始就遵循最佳实践。

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.