Code Complete(第 7 章第 3 节)说,一个好的函数应该根据它返回的值来命名,而一个类中的一个好的过程名称应该根据它所做的来命名。
当我在 Delphi 中(2009 年之前)编写同步方法时,有时需要使用它们来设置全局变量,这似乎是一种不好的编程习惯,但由于我无法传递变量,因此这是必要的。我不想称它们为“Get”或“Set”,因为我将它们用于我的属性方法。
有人对这些有更好的命名约定吗?
Code Complete(第 7 章第 3 节)说,一个好的函数应该根据它返回的值来命名,而一个类中的一个好的过程名称应该根据它所做的来命名。
当我在 Delphi 中(2009 年之前)编写同步方法时,有时需要使用它们来设置全局变量,这似乎是一种不好的编程习惯,但由于我无法传递变量,因此这是必要的。我不想称它们为“Get”或“Set”,因为我将它们用于我的属性方法。
有人对这些有更好的命名约定吗?
我不想称它们为“Get”或“Set”,因为我将它们用于我的属性方法。
这似乎是一个相当武断的决定。您是否还说您不想在“setName”上使用“set”,因为您也在“setAge”上使用过它?
也就是说,使用 setter 进行静态实际上是一个公共全局变量 ALA Basic——您确定这是完成任务的唯一方法吗?
我并不是说静态是绝对错误的,但是您应该尽最大努力在定义它的对象中操纵它,而不是使用 setter,否则您会以一种很难的方式暴露很多对象的内部状态控制。
属性 getter 和 setter 没有以get和set开头的名称,因为它是为命名 getter 和 setter 保留的一些约定。他们有这些名字是因为他们就是这样做的。由于您的同步方法的目的是设置变量的值,因此给它一个“设置”名称非常有意义。
您可以选择一个同义动词,例如assign或copy,只是为了区别于set不同,但出于您所描述的目的,这些都是非常规的名称。当您有一个设置 的值的例程时Foo
,约定规定该函数必须命名为SetFoo
。最终,我认为您只需要克服使用get和set处理非属性访问器的问题。
我想说 Code Complete 的建议非常有力,而您的反对意见“因为我将它们用于我的属性方法”非常弱。无论如何,这些属性设置器/获取器应该是私有的。将其视为一种重载形式并将它们称为 SetFoo 和 GetFoo。
你用的是什么德尔福版本?如果使用 D2006 或 2007,您可以使用类方法将全局变量移动到类属性中以获取和设置值。由于这些是属性获取器和设置器,因此使用 Get 和 Set 是合适的。
type
TMyObject = class(TObject)
private
class var
FStringProperty : string;
class function GetStringProperty: String; static;
class procedure SetStringProperty(const Value : string);static;
public
class property StringProperty : String read GetStringProperty write SetStringProperty;
end;
在我看来,写入全局变量应该很容易与普通的 setter 区分开来。如果无法避免全局变量,我通常使用
SetGlobalFoo(...);
以此目的。长名称的开销是好的 IMO,因为这些结构应该很少使用。
我将SetXXX
andGetXXX
用于私有和全局变量,因为我看不出这些方法的作用有什么不同。对数据区域的操作SetXXX
是一个集合。如果该数据区域是全局的、本地的或远程的,则它是该方法的内部细节,不应从外部看到。
IDE 将帮助您了解该数据区域是否是本地的,但如果您愿意,您可以编写一行简单的注释来说明它。