您使用什么类型的变量名来比较两个对象

时间:2009-01-14 05:08:21

标签: language-agnostic scripting variables

我做了大量的数据分析脚本,比较两个对象或字符串来确定差异或提出需要填补的空白。
当你处于循环中时,将对象a与对象b进行比较,你是否有一个有意义的首选编码标准(即,它是自我记录的)并且可以很好地传播到其他代码?或者这类代码中的变量名称无关:

for (String a : TreeMapvar) {  
    // Read b from data source  
    if (a.equals(b)) {  
        // Update a  
    }  else {
        TreeMapvar.add(b);
}

另一个例子:

TreeMap<String, MyObject> TreeMapvar = new TreeMap<String, Object>();
File f = "Somefile";
// Open the file with bufferedReader br  
while ((line=br.readLine)!=null)) {  
    //insert code parse line to get object a  
    if (TreeMapvar.containsKey(a)) {  
        if (TreeMapvar.get(a).somefield.equals(a.somefied)) {  
            //insert code to update a  
        } else {  
            //insert code to insert new object  
        }  
     }  
}

5 个答案:

答案 0 :(得分:3)

我认为变量名称根本不相关,但是在这样的循环中没有适合所有可能情况的良好通用名称。它取决于存储在TreeMap中的内容数据源包含的内容。不过,我们可以说像

for (String localData : TreeMapvar) {  
    // Read remoteData from data source  
    if (localData.equals(remoteData)) {  
        // Update or add to a counter  
    }  
}

如果我得到你的漂移。

事实是,通过使用.equals()可以明显地进行比较,因此我们不需要使用变量名(一般来说)来表示要比较值,哪些不明显(和因此更重要的是比较什么价值。

编辑:你的第二个例子什么都没改变。你还在使用糟糕的varnames a和b,在那里你应该使用描述a和b实际表示的描述。我仍然看到比较清楚,因此与命名无关。

编辑(重新,你的评论):这很容易。唯一需要的是一些上下文,假设Map包含与您喜欢的任何内容相关联的用户名,并且您将它们与现有用户信息进行比较。

for (String a : TreeMapvar) {  
    // Read b from data source  
    if (a.equals(b)) {  
        // Update or add to a counter  
    }  
}

for (String userName : TreeMapvar) {  
    String existingUserName = getNextUserName();
    if (userName.equals(existingUserName)) {  
        // Update or add to a counter  
    }  
}

答案 1 :(得分:2)

变量名称应该增强代码的可读性,在您的示例中(不尝试修改代码):

  1. a可以命名为baseValue
  2. b可以命名为compareToValue或testValue
  3. 所以如果(a.equals(b)){
    变 if(baseValue.equals(compareToValue)){

答案 2 :(得分:1)

好吧,如果你需要2个变量名,让我们称它们为a和b,那么你可能有3个对象:self,a,b。

现在,这对我来说相当多,我试着让事情变得更小。

所以,考虑你的第一个例子:

for (String a : TreeMapvar) {  
    // Read b from data source  
    if (a.equals(b)) {  
        // Update a  
    }  else {
        TreeMapvar.add(b);
}

那么,为什么不让你的整个片段成为b类定义的一部分并将b重命名为“this”?

lookAtYourTreeMap() {
    for( String a : TreeMapvar) {
      this.accomodateTreemapIfNecessaryTo(a);
    }
}

然后我会有一个方法

accomodateTreemapIfNecessaryTo(a) {
  if(a .equals( this)) {
     a.update();
  } else {
    TreeMapVar.add(a);
  }
}

请注意,现代计算机的发明者Kent Beck说,方法需要简短。

在第三个组件中启动整个事情,如下所示:

B b = loadBFromSource();
b.lookAtYourTreemap();
像你这样的循环我称之为“结构代码”。

答案 3 :(得分:0)

如果有问题的语言实现了运算符重载,那么我将实现==运算符。如果没有,那么您可以使用上述等于或实现“比较”功能

您的语言或框架可能已经为字符串实现了这两个。你必须记住,大多数语言中的“等于”功能都会比较参考(浅层)经文(深层)。

比较功能如下所示:

int Compare(string a, string b)
{
  if(a < b) return -1;
  else if (a == b) return 0;
  else return 1;
}

答案 4 :(得分:0)

简而言之,上下文(变量的名称代表它所拥有的内容)&amp;可读性是我认为重要的。


foreach(Order order in Orders)
{
    if (order.ID == queriedOrderID)....
}