私はHaxeでコードを書いています。ただし、これは高級言語であり、Java、ActionScript、JavaScript、C#などと比較できることを念頭に置いている限り、この質問とはまったく関係ありません(ここでは擬似コードを使用しています)。
私は大きなプロジェクトに取り組むつもりで、今準備に忙しいです。ただし、この質問では、小さなシナリオを作成します。Mainクラス(これはアプリケーションの起動時に実行されます)とLoginScreenクラス(これは基本的に、ユーザーがログイン画面をロードできるようにするクラスです)を持つ単純なアプリケーションです。ログインする)。
通常、これは次のようになります。
Main constructor:
loginScreen = new LoginScreen()
loginScreen.load();
LoginScreen load():
niceBackground = loader.loadBitmap("somebg.png");
someButton = new gui.customButton();
someButton.onClick = buttonIsPressed;
LoginScreen buttonIsPressed():
socketConnection = new network.SocketConnection();
socketConnection.connect(host, ip);
socketConnection.write("login#auth#username#password");
socketConnection.onData = gotAuthConfirmation;
LoginScreen gotAuthConfirmation(response):
if response == "success" {
//login success.. continue
}
この単純なシナリオでは、クラスに次の依存関係と欠点が追加されます。
- LoginScreenがないとメインはロードされません
- LoginScreenは、カスタムローダークラスがないとロードされません
- LoginScreenは、カスタムボタンクラスがないと読み込まれません
- LoginScreenは、カスタムSocketConnectionクラスがないとロードされません
- SocketConnection(将来的には多くの異なるクラスからアクセスする必要があります)がLoginScreen内に設定されました。これは、LoginScreenが初めてソケット接続を必要とするという事実を除けば、実際にはまったく関係ありません。
これらの問題を解決するために、「イベント駆動型プログラミング」または緩い結合を行うことをお勧めします。私が理解している限り、これは基本的に、クラスを互いに独立させてから、別々のバインダーでそれらをバインドする必要があることを意味します。
それで質問1:それについての私の見解は正しいですか、それとも間違っていますか?バインダーを使用する必要がありますか?
アスペクト指向プログラミングがここで役立つと聞きました。残念ながら、Haxeはこの構成をサポートしていません。
ただし、基本的にシグナルラーの作成(public var loginPressedSignaller = new Signaller())、シグナルラーの起動(loginPressedSignaller.fire())、シグナルラーのリッスン(someClass.loginPressedSignaller)を可能にするイベントライブラリにアクセスできます。 .bind(doSomethingWhenLoginPressed))。
したがって、これ以上の調査をほとんど行わずに、これにより以前の設定が次のように変更されることがわかりました。
Main:
public var appLaunchedSignaller = new Signaller();
Main constructor:
appLaunchedSignaller.fire();
LoginScreen:
public var loginPressedSignaller = new Signaller();
LoginScreen load():
niceBackground = !!! Question 2: how do we use Event Driven Programming to load our background here, while not being dependent on the custom loader class !!!
someButton = !!! same as for niceBackground, but for the customButton class !!!
someButton.onClick = buttonIsPressed;
LoginScreen buttonIsPressed():
loginPressedSignaller.fire(username, pass);
LoginScreenAuthenticator:
public var loginSuccessSignaller = new Signaller();
public var loginFailSignaller = new Signaller();
LoginScreenAuthenticator auth(username, pass):
socketConnection = !!! how do we use a socket connection here, if we cannot call a custom socket connection class !!!
socketConnection.write("login#auth#username#password");
このコードはまだ完成していません。私はまだサーバーの応答をリッスンする必要がありますが、おそらく私が行き詰まっている場所を理解しているでしょう。
質問2:この新しい構造は意味がありますか?上記の問題をどのように解決すればよいですか!!! 区切り文字?
それから私はバインダーについて聞いた。したがって、すべてを接続するために、クラスごとにバインダーを作成する必要があるかもしれません。このようなもの:
MainBinder:
feature = new Main();
LoginScreenBinder:
feature = new LoginScreen();
MainBinder.feature.appLaunchedSignaller.bind(feature.load);
niceBackgroundLoader = loader.loadBitmap;
someButtonClass = gui.customButton();
など...うまくいけば、あなたは私が何を意味するのか理解しています。この投稿は少し長くなっているので、少しまとめる必要があります。
質問3:これは意味がありますか?これは物事を不必要に複雑にしませんか?
また、上記の「バインダー」では、一度インスタンス化されたクラスを使用するだけで済みました。ログイン画面。クラスのインスタンスが複数ある場合はどうなりますか。チェスのゲームのプレーヤークラス。