web-dev-qa-db-ja.com

2つのクラスに同じ名前でシグネチャが異なる2つのメソッドがあることはどれほど悪いですか?

パブリックインターフェイス、メソッドの名前、APIとコードの理解に関連する設計上の問題があります。

このような2つのクラスがあります。

class A:
    ...
    function collision(self):
        ....

...

class B:
    ....
    function _collision(self, another_object, l, r, t, b):
        ....

最初のクラスにはcollisionという名前のパブリックメソッドが1つあり、2番目のクラスには_collisionという名前のプライベートメソッドがあります。 2つの方法は、引数のタイプと数が異なります。

例として、_collisionがオブジェクトが特定の条件を持つ別のオブジェクトと衝突しているかどうかをチェックするとしますlrtb(左側、右側などで衝突)を返し、trueまたはfalseを返します。一方、public collisionメソッドは、オブジェクトと他のオブジェクトとのすべての衝突を解決します。

2つのメソッドの名前は同じですが、ほとんど同じことをするが、コンテキストとクラスが異なるメソッドには、異なる名前でデザインをオーバーロードしないようにした方がよいと思います。

これは読者にとって十分明確ですか、それともメソッドの名前を変更する必要がありますか?

4
Super User

これらの関数はどちらも衝突と関係がありますが、whatは非常に異なるため、実際に何を行うかをより明確に説明する名前を付けると、将来の開発者が違いを理解しやすくなります内部のロジックを見てください。

オブジェクトが別のオブジェクトと衝突しているかどうかをチェックするメソッドは、checkForCollisionと呼ばれます。

オブジェクトと他のオブジェクトの衝突を解決するメソッドは、resolveCollisionsまたはhandleCollisionsと呼ばれます。

2つの関数がほとんど同じことをする場合、多くの場合best timeは、それらの違いを明確にするためにより具体的な名前を付けます。

21
Mike Partridge

これには何の問題もないと思います。メソッドのオーバーロードは、いくつかの理由から、かなり標準的な方法です。まったく同じ機能を使用していて、2つの異なる一連のパラメーターについてのみ、同じ正確な名前を使用することは完全に意味があり、パラメーターリストが2つの関数の実際の唯一の違いであることを明確にするのにも役立ちます。それは本当にそれをサポートする言語でコーディングすることをより簡単にします。

これらの2つの関数が2つのわずかに異なることを実行すること(A.collision()はB._collision()よりも一般的です)に関しては、この場合、2つの理由で問題ありません。

  1. 彼らは本当に過負荷ではありません。 "collision" <> "_collision"(Pythonがここで何か知らない場合を除いて)。

  2. 彼らは本当に過負荷ではありません。クラスA <>クラスB。基本名が同じでも、他のプログラマーは2つの異なるクラスの関数をかなり簡単に区別できるはずです(一方が他方をサブクラス化している場合を除く)。クラスが異なれば、明らかに物事も異なる傾向があります。

3
Panzercrisis

素人の言葉で:

  1. メソッド名は動詞である必要がありますなので、両方の名前は不適切です。
  2. 適切な名前を(動詞を使用して)与えると、2つのメソッドの名前が一致することはほとんどありません。
  3. 2つのメソッドに同じ名前が付いていても、それらは異なるクラスにありますであり、名前空間が異なるために混乱することはありません。
  4. スタイル(またはそれ以外の場合)のルールはありません 2つの異なるクラスまたはインターフェイスは、同じシグネチャ(パラメーターリスト)を持っている場合でも、同じ名前のメソッドを持つことはできないと述べています。

例えば

// there's absolutely no problem with this totally unrelated (or related) classes:
databaseClient.connect();
odbcSource.connect();
navii.connect();
fireHose.connect();

短い答え:何も問題はありません。

3