2012-11-30 57 views
0

对于基本问题,我很抱歉,我确信我之前已经被告知答案,并且我花了一些时间寻找但找不到一个好答案(可能是因为它很难以短语作为搜索查询),我之前做过一些OO编程,但最近我做了很多程序化的东西,这似乎让我的想法变得模糊不清。面向对象,传递变量或使用对象状态

我有了处理字符串的工作计划,该计划的一部分,涉及消毒的字符串,所以我有这样的方法:

private void sanitizeString() { 
    removeEscape(); 
    removePunctuation(); 
    removeCaps(); 
} 

和更早版本的类中声明的变量

String x = "... some string ..." 

在过程中,你显然会传递所有他们需要处理的函数的字符串,我的问题是在OO中,这个字符串可以在类的顶部声明,然后就像

private void removeCaps() { 
    x = x.toLowerCase(); 
} 

还是应

private String removeCaps(String y) { 
    y = y.toLowerCase(); 
    return y; 
} 

我想,这应该是第一种方式,我知道这工程确定,但即时通讯做的事情必须表现出良好的面向对象的,所以我只是想检查我有我的基本假设是正确的。

感谢

回答

0

由于x被声明为类变量,这一个是好的:

private void removeCaps() { 
     x = x.toLowerCase(); 
    } 

类变量类方法中访问,你不需要把类变量相同类方法的参数

只有这种方式才能访问相同的类变量。非常简单的例子可以是POJO类,您可以在其中声明类变量并通过getter/setter方法公开它们。您不需要将类变量传递给这些方法,并且某些时候您不能(例如,在getter方法中)。

在方法中添加一些关于类变量和局部变量的想法。

  1. 如果需要一个理论上与类定义相关的变量,那么该变量应该定义为类变量。例如employeeId,employeeName ..员工类中的变量应定义为Employee类变量。

  2. 如果有可变的需求,其是本地的,而不是所要求的方法/类以外的任何地方的一类方法,则它应该被定义为在该方法内的局部变量。

  3. 如果您正在定义一些实用方法来使用某些变量进行响应,那么应该将这些变量作为参数传递给util方法。

回到你的问题:

如果要定义一个完整的类如Sanitising,它有几个方法围绕字符串变量例如字符串类本身,那么最好将你的字符串定义为类变量,并使用类变量编写方法。

但是如果要定义Sanitising作为一个实用程序/辅助类,然后才能通过字符串作为方法参数因为通常你不;吨希望你UTIL方法是有状态的(与类实例相关联)。

+0

如果我以正确的方式思考它,不同类别修改的'全局变量'仍然是一个坏主意,与过程相同,但'类变量'可以吗? – Mike

+0

@Mike是的。 **这个答案适用于类方法和类变量而不是全局变量。**相同的类变量只能以这种方式访问​​。非常简单的例子gould是POJO,你声明类变量并通过getter/setter方法暴露它们。你不需要将类变量传递给这些方法,并且一段时间,你不能。 –

+0

非常好,感谢信息 – Mike

0

要表现出良好的面向对象的,你应该definitly使用

private String removeCaps(String y) { 
    return y.toLowerCase(); 
} 

可以在全球领域x你的字符串传递你的对象,在这种情况下该方法的参数。该字符串然后在本地字段y中并返回修改后的版本。

1

你有一个权衡这里:

  1. 声明变量为类变量意味着你必须为你想清理每个字符串的新对象。

  2. 将String变量传递给每个方法意味着您可以重复使用同一个对象来清理多个Strings。

您必须衡量每种方法的优缺点,以确定哪种方法最适合您的特定情况。

+0

绝对选择1在这种情况下,然后,该类的每个实例读取一个字符串,解析它并返回一些输出 – Mike

+0

+1我会给,但我已经做到了足够的今天。但这是迄今为止最好的答案。 :) –