英文:
Naming convention for boolean field to avoid variable name conflict
问题
我有一个Employee
类。它需要一个布尔标志来指示该员工是否为经理。
从这个问题中https://stackoverflow.com/questions/5322648/for-a-boolean-field-what-is-the-naming-convention-for-its-getter-setter
我理解命名约定是将变量命名为X
,getter命名为isX
。所以我的Employee
类会像这样
class Employee {
boolean manager;
boolean isManager(){
return this.manager;
}
}
但是manager
这个名称让我感到困惑。单词manager
是一个名词,不是形容词,就像上面的问题中的active
、current
、open
。manager
可以是一个布尔标志,也可以是一个经理对象。此外,如果我确实想在Employee
类中为经理设置成员变量,manager
变量名已经用于标志。
class Employee {
boolean manager;
boolean isManager(){
return this.manager;
}
//Employee manager; //不知道如何命名
}
在这种情况下,有没有另一种方法来命名布尔型经理标志?谢谢。
英文:
I have an Employee
class. It needs a boolean flag to tell if this employee is a manager.
From this question https://stackoverflow.com/questions/5322648/for-a-boolean-field-what-is-the-naming-convention-for-its-getter-setter
I understand that the naming conversion is to name the variable as X
and the getter as isX
. So my Employee
class would be like this
class Employee {
boolean manager;
boolean isManager(){
return this.manager;
}
}
But the name manager
is confusing to me. The word manager
is a noun, not an adjective, like active
, current
, open
in the above question. manager
could be a boolean flag or a manager object. Furthermore, if I do want a member variable for the manager in the Employee
class, the manager
variable name is already taken for the flag.
class Employee {
boolean manager;
boolean isManager(){
return this.manager;
}
//Employee manager; //don't know how to name this
}
Is there another way to name the boolean manager flag in this case? Thanks
答案1
得分: 2
一种选择是使用双值枚举来替代布尔值:
class Employee {
enum Type { REGULAR, MANAGER }
Type type = Type.REGULAR;
Employee manager;
Type getType() {
return type;
}
Employee getManager() {
return manager;
}
}
也可以在枚举名称和获取方法名称中使用 Role
或 Level
,而不是 Type
。
英文:
One option is to use a two-value enum in place of a boolean:
class Employee {
enum Type { REGULAR, MANAGER }
Type type = Type.REGULAR;
Employee manager;
Type getType() {
return type;
}
Employee getManager() {
return manager;
}
}
One could also use Role
or Level
instead of Type, both in the enum name and in the get-method name.
答案2
得分: 1
好的,以下是翻译好的内容:
这里真正的冲突在数据建模层面。
- 员工 是一个 经理(布尔标志)
- 员工 拥有一个 经理(员工值字段)
这里有两个(可能)不同的“经理”概念,但名称相同。那么我们如何在模型层面处理这个(明显的)冲突?
- 我们可以忽略它。
- 我们可以简单地重命名其中一个概念。但这是一个不好的想法,因为这两个概念可能密切相关1。
- 我们可以深入研究这些概念;即“作为具有经理地位的人”和“担任另一个人的经理角色”之间是否有显着(对于模型而言)的区别。这 可能 告诉我们这些概念有足够不同,需要具有不同的名称。
所以假设我们在建模层面忽略它,我们如何在 Java 层面处理它呢?以下是一些建议:
版本#1具有相同名称的两个不同属性。这可能违反了JavaBeans的约定... 至少大多数人理解的约定。
public class Employee {
private boolean isManager;
private Employee manager;
public boolean isManager(){
return this.isManager;
}
public Employee getManager(){
return this.manager;
}
}
版本#2调整了属性名称。例如,使用“manager”和“aManager”:
public class Employee {
private boolean isManager;
private Employee manager;
public boolean isAManager(){
return this.isManager;
}
public Employee getManager(){
return this.manager;
}
}
或者您可以调整另一个属性名称。
1 - 例如,在 UML 术语中,您可以将“经理”属性建模为从将员工与他们的经理相关联的关联中 派生 出来的。该属性值可以通过测试是否通过关联是另一位员工的经理来派生。
英文:
OK, so the real conflict here is at the data modelling level.
- An Employee is-a manager (the boolean flag)
- An Employee has-a manager (the Employee valued field)
There are two (possibly) different "manager" concepts with the same name. So how do we deal with this (apparent) conflict at the model level?
- We could ignore it.
- We could simply rename one or other of the concepts. But that is a bad idea because the two concepts are probably intimately related<sup>1</sup>.
- We could drill down on the concepts; i.e. is there a significant (to the model) difference between "being a person with manager status" and "being in the role of manager for another person". This could tell us that the concepts are sufficiently different that they need to have different names.
So assuming that we ignore it at the modeling level, how do we deal with it at the Java level? Here are a couple of suggestions:
Version #1 has two distinct properties with the same name. This is probably a violation of the JavaBeans convention ... at least as most people understand it.
public class Employee {
private boolean isManager;
private Employee manager;
public boolean isManager(){
return this.isManager;
}
public Employee getManager(){
return this.manager;
}
}
Version #2 tweaks the property names. For example, use "manager" and "aManager":
public class Employee {
private boolean isManager;
private Employee manager;
public boolean isAManager(){
return this.isManager;
}
public Employee getManager(){
return this.manager;
}
}
Or you could tweak the other property name.
<sup>1 - For example, in UML terms you could model the "manager" Attribute as derived from the Association that relates an employee to their manager. The attribute value can be derived by testing if this employee is a manager of any another employee via the association.</sup>
答案3
得分: 0
这是一个很好的问题!... 因为我多年来一直在为这种情况苦苦挣扎,但始终没有找到最佳的表达方式。😄 是否考虑使用名词 + "Typed" 后缀来命名布尔变量,并在 getter 方法中保持 "is" + 名词 的形式?这样你就可以得到:
class Employee {
boolean managerTyped;
boolean isManager() {
return this.managerTyped;
}
Employee manager;
}
英文:
This is a great question! ...as I also been struggling with this kinda thing for years, and yet still not able to find the best formulation for it. 😄 How about naming the boolean variable with the noun + "Typed"
suffix, and stick with the "is"
+ Noun for the getter? So you would get:
class Employee {
boolean managerTyped;
boolean isManager() {
return this.managerTyped;
}
Employee manager;
}
答案4
得分: -2
像这样怎么样?
class Employee {
Employee manager;
boolean isManager(){
return (manager != null && manager instanceof Manager);
}
}
英文:
How about something like this?
class Employee {
Employee manager;
boolean isManager(){
return (manager != null && manager instanceof Manager);
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论