将 s _ 应用于被认为是控制系统的一部分的软件的“安全关键”的变量和方法。把这个规则和另一个关于把 m _ 放在成员变量前面的规则结合起来,你会得到一些荒谬的东西,比如“ s _ m _ la ()”,写起来非常烦人,而且在我看来不是很好读。最后,一些“安全专家”应该通过查看代码并使用这些“ s _”来确定一些东西,从而获得洞察力——在实践中,他们对 c + + 不太了解,所以除了报告我们标记为“安全关键”的标识符的数量之外,他们不能做太多其他的事情。一派胡言。
如果我没记错的话,delphi IDE 默认缩进了两个空格。公司的大多数遗留代码有三个空格,由副总裁 IT 和首席执行官编写。有一天,所有的程序员都在讨论我们应该怎样做才能让我们的生活变得更简单,一个非常了解 Delphi 的承包商说: “嘿,IDE 默认为两个空格,有人对我们在新代码中这样做有意见吗?”我们所有人都看着对方,几乎认为这是一个毫无疑问的,并说我们同意。
package Package_Name renames NABC_Package_Name;
package Some_Other_Package_Name renames CXYZ_Some_Other_Package_Name;
--// Repeated in this vein for an average of 10 lines or so
...
If Lvarbool1 Then
Lvarbool2 = True
End If
If Lvarbool2 Or Lvarstr1 <> Lvarstr5 Then
db.Execute("DELETE FROM customer WHERE " _
& "reserve_field_12 = '" & Lvarstr1 & "'")
End If
...
你可以想象修复旧的或者别人的代码有多难。
最新更新: 现在我们也对私人会员使用“预约程序”:
Private Sub LSub1(Lvarlong1 As Long, Lvarstr1 As String)
If Lvarlong1 >= 0 Then
Lvarbool1 = LFunc1(Lvarstr1)
Else
Lvarbool1 = LFunc6()
End If
If Lvarbool1 Then
LSub4 Lvarstr1
End If
End Sub
1987年左右,我在一家公司找到了一份工作,公司雇佣了我,因为我是少数几个知道如何使用《启示录》的人之一。启示录,如果你从来没有听说过它,本质上是一个基于 PC 的实现拣选操作系统——如果你从来没有听说过它,它的名字得到了它的发明者,令人难以置信的名字迪克拣选。关于选择操作系统可以说很多,大多数都是好的。许多超小型供应商(至少是 Prime 和 MIPS)使用 Pick,或者他们自己的自定义实现。
这家公司是一个主要的商店,他们的内部系统,他们使用的信息。(不,那其实是它的名字: 它是 Prime 对 Pick 的实现。)他们与政府签订了建立一个基于 PC 的系统的合同,并且在启示录项目中投入了大约一年的时间,直到那个做所有工作的家伙,同时也是他们的管理信息系统主管,决定他不能再同时做这两份工作,于是雇佣了我。
无论如何,他已经为他们的基于 Prime 的软件建立了一些编码标准,其中许多源于两个基本条件: 1)使用80栏的哑终端,2)事实上,由于 Prime 没有可视化编辑器,他已经编写了自己的。由于拣选代码的神奇可移植性,他将自己的编辑器引入到《启示录》中,并使用它在 PC 上构建了整个项目。
当然,启示录是基于 PC 的,有一个非常好的全屏编辑器,并且在您浏览第80栏时没有反对。然而,在我到那里的头几个月,他坚持要我用他的编辑和他的标准。
************************************************************************
** IN CASE YOU NEVER HEARD OF ONE, OR COULDN'T GUESS FROM ITS NAME, **
** THIS IS A FLOWER BOX. **
************************************************************************
让他妥协让我使用《启示录》的内置编辑器真是一场艰苦的战斗。一开始他很坚持,只是因为这是规矩。当我反对的时候,a)我已经知道启示录的编辑器 b)它实质上比他的编辑器功能更多 c)其他的启示录开发者会有同样的观点,他反驳说如果我不在他的编辑器上训练,我将永远不能在 Prime 代码库上工作,我们都知道,只要地狱仍然不冻结,这是不会发生的。最后他屈服了。
不过,更好的做法是坚持所有表名都是单数,然后让类也成为代码单数。但是它们不仅表示对象,比如用户或组,它们还表示表,并包含该表的所有 CRUD 和许多其他操作。等等,还有呢!它们还必须包含一个公开可见的名称/值集合,以便您可以通过索引器按列名获取属性,以防您添加了一个新列但不想添加新属性。还有许多其他的“必须做的事情”,这些事情不仅没有意义,而且对代码的性能也有很大的影响。我可以试着把它们全部指出来,但是代码本身就说明了一切,遗憾的是,这几乎是我刚刚从一个旧的归档文件夹中提取出来的 User 类的一个精确副本:
public class Record
{
private string tablename;
private Database database;
public NameValueCollection Fields;
public Record(string TableName) : this(TableName, null) { }
public Record(string TableName, Database db)
{
tablename = TableName;
database = db;
}
public string TableName
{
get { return tablename; }
}
public ulong ID
{
get { return GetULong("ID"); }
set { Fields["ID"] = value.ToString(); }
}
public virtual ulong GetULong(string field)
{
try { return ulong.Parse(this[field]); }
catch(Exception) { return 0; }
}
public virtual bool Change()
{
InitializeDB(); // opens the connection
// loop over the Fields object and build an update query
DisposeDB(); // closes the connection
// return the status
}
public virtual bool Create()
{
// works almost just like the Change method
}
public virtual bool Read()
{
InitializeDB(); // opens the connection
// use the value of the ID property to build a select query
// populate the Fields collection with the columns/values if the read was successful
DisposeDB(); // closes the connection
// return the status
}
}
public class User
{
public User() : base("User") { }
public User(Database db) : base("User", db) { }
public string Username
{
get { return Fields["Username"]; }
set
{
Fields["Username"] = value.ToString(); // yes, there really is a redundant ToString call
}
}
}
我们过去的 c # 编码标准要求我们使用巨大的、丑陋的注释块。你知道在代码完成中,Steve McConnell给出了一个丑陋的注释宏的主要例子吗?那个。几乎完全吻合。
最糟糕的是 c # 是一种已经有很好的(相对不那么显眼的)注释支持的语言。
你会得到这样的东西:
/// <summary>
/// Add an item to the collection
/// </summary>
/// <parameter name="item">The item to add</parameter>
/// <returns>Whether the addition succeeded</returns>
public bool Add(int item) { ... }
就会变成这样:
// ########################################################## //
/// <summary>
/// Add an item to the collection
/// </summary>
/// IN: <parameter name="item">The item to add</parameter>
/// OUT: <returns>Whether the addition succeeded</returns>
// ########################################################## //
需要注意的是,StackOverflow 的语法突显并没有像默认的 VS 文本模式那样做得很好,# 符号是亮绿色的,导致你的视网膜受到强烈的侵犯。
我只能假设作者真的,真的很喜欢它从以前的努力与 C/C + + 。问题是,即使你只有几个自动属性,它也会占据你屏幕空间的50% ,并且增加显著的噪音。额外的//行也搞砸了 R # 的重构支持。
在我们放弃了注释宏之后,我们最终用一个脚本打败了整个代码库,这个脚本把我们带回到了 Visual Studio 默认的 c # 注释风格。
The first programming job I had was with a Microsoft QuickBASIC 4.5 shop. The lead developer had been working in BASIC just about forever, so most of the advanced (!) features of QuickBASIC were off-limits because they were new and he didn't understand them. So: