ビジターパターンを使用すると、オブジェクトクラスを拡張せずにオブジェクトに対する操作を記述できます。もちろん。しかし、オブジェクトコレクションを外部から操作するグローバル関数または静的クラスを作成しないのはなぜですか?基本的に、Javaのような言語ではaccept()
、技術的な理由からメソッドが必要です。しかし、メソッドなしで同じデザインを実装できる言語でaccept()
は、Visitorパターンは簡単になりますか?
説明:ビジターパターンでは、ビジタークラス(エンティティ)には.accept()
、ビジターの.visit()
メソッドを自分で呼び出すことを目的としたメソッドがあります。Javaの例のロジックを見ることができます。訪問者は、サポートする.visit(n)
訪問可能なタイプごとに異なるメソッドを定義し、実行時にそれらの中から選択するためにトリックを使用する必要があります。しかし、pythonやphpのような言語には動的型付けがあり、メソッドのオーバーロードはありません。私が訪問者である場合、エンティティのタイプやメソッドの完全な署名さえ知らなくても、エンティティメソッド(たとえば)を呼び出すことができます。(それは「ダブルディスパッチ」の問題ですよね?)n
.accept()
.serialize()
acceptメソッドが保護されたデータを訪問者に渡すことができることは知っていますが、ポイントは何ですか?データがビジタークラスに公開されている場合、その詳細はクラスの外部で重要になるため、データは事実上クラスインターフェイスの一部になります。とにかく、個人データを公開することは、訪問者のパターンのポイントとして私を襲うことはありませんでした。
つまり、python、ruby、またはphpでは、visitedオブジェクトにacceptメソッドを使用せずに(そしてリフレクションなしで)、visitorのようなクラスを実装できるようです。「visited」クラスの協力なしに、異種オブジェクトのファミリーを操作してそれらのパブリックメソッドを呼び出すことができる場合でも、これは「Visitorパターン」と呼ばれるに値しますか?私が見逃しているパターンの本質に何かありますか、それとも単に「オブジェクトを外部から操作して操作を実行する新しいクラスを作成する」ということですか?
PS。私はSOや他の場所でたくさんの議論を見てきましたが、この質問に対処するものは何も見つかりませんでした。ポインタは大歓迎です。