0

こんにちは、基本的な質問で申し訳ありません。以前に答えを教えてもらったことがあり、検索に時間を費やしましたが、適切な答えを見つけることができませんでした (おそらく、検索クエリとして表現するのが難しいため)。以前はOOプログラミングを少ししていましたが、最近は手続き型のものをたくさんやったので、それが私の考えを曇らせているようです.

文字列を操作する必要があるプログラムがあります。そのプログラムの一部には文字列のサニタイズが含まれているため、次の方法があります。

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

そして、クラスの前半で変数を宣言しました

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

手続き型では、明らかにすべての関数に作業が必要な文字列を渡します。私の質問はオブジェクト指向で、この文字列をクラスの先頭で宣言してから、次のようなことをしても大丈夫ですか?

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

それともそうあるべきか

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

これが最初の方法であるべきだと思います。それがうまくいくことはわかっていますが、良いOOを実証する必要があることをやっているので、基本的な仮定が正しいことを確認したいだけです。

ありがとう

4

3 に答える 3

1

ここでトレードオフがあります:

  1. 変数をクラス変数として宣言するということは、サニタイズする文字列ごとに新しいオブジェクトを作成する必要があることを意味します。

  2. String 変数を各メソッドに渡すということは、同じオブジェクトを再利用して複数の String をサニタイズできることを意味します。

それぞれのアプローチの長所と短所を比較検討して、特定の状況に最も適した方法を決定する必要があります。

于 2012-11-30T21:23:07.080 に答える
0

xはクラス変数として宣言されているため、これで問題ありません。

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

クラス変数はクラスメソッド内でアクセス可能であり、クラス変数を引数として同じクラスメソッドに渡す必要がないため

同じクラス変数は、この方法でのみアクセスされます。非常に単純な例は、クラス変数を宣言し、getter/setter メソッドを介して公開する POJO クラスです。クラス変数をこれらのメソッドに渡す必要はありませんが、(getter メソッドなどで) 渡すことができない場合もあります。

メソッド内のクラス変数とローカル変数に関する考えを追加します。

  1. クラス定義に理論的に関連付けられている変数が必要な場合は、その変数をクラス変数として定義する必要があります。たとえば、employeeId、employeeName.. 従業員クラスの変数は、従業員クラス変数として定義する必要があります。

  2. クラスメソッドにのみローカルであり、メソッド/クラスの外部では必要ない変数が必要な場合は、メソッド内でローカル変数として定義する必要があります。

  3. いくつかの変数を使用して応答するユーティリティ メソッドを定義している場合は、それらの変数を引数としてユーティリティ メソッドに渡す必要があります。

質問に戻る:

クラス全体を定義している場合、たとえばSanitising文字列変数の周りにいくつかのメソッドがあり、たとえば String クラス自体がある場合は、文字列をクラス変数として定義し、クラス変数を使用してメソッドを記述することをお勧めします。

Sanitising ただし、util/helper クラスとして定義している場合は、通常はメソッドの引数として文字列を渡す方がよいでしょう。util メソッドをステートフル (クラス インスタンスに関連付ける) にしたくないからです。

于 2012-11-30T21:18:20.177 に答える
0

優れたオブジェクト指向を実証するには、間違いなく使用する必要があります

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

オブジェクト、この場合はグローバル フィールドの文字列xをパラメータとしてメソッドに渡すことができます。String は local フィールドyにあり、変更されたバージョンを返します。

于 2012-11-30T21:20:49.940 に答える