高级语言中的松散编程,如何,为什么以及多少?

时间:2010-07-09 10:27:07

标签: events oop functional-programming haxe aop

我在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
  • 如果没有我们的自定义SocketConnection类
  • ,则不会加载LoginScreen
  • 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:这个新结构有意义吗?我该如何解决上面提到的问题!!!定界符?

然后我听说了粘合剂。所以也许我需要为每个类创建一个binder,将所有东西连接在一起。像这样:

MainBinder:
feature = new Main();    

LoginScreenBinder:
feature = new LoginScreen();
MainBinder.feature.appLaunchedSignaller.bind(feature.load);
niceBackgroundLoader = loader.loadBitmap;
someButtonClass = gui.customButton();
等等......希望你理解我的意思。这篇文章有点长,所以我不得不把它包起来。

问题3:这有什么意义吗?这不会使事情变得不必要地复杂化吗?

此外,在上面的“Binders”中,我只需要使用一次实例化的类,例如。登录屏幕。如果有多个类的实例,例如。国际象棋比赛中的球员类。

2 个答案:

答案 0 :(得分:9)

答案 1 :(得分:1)

首先,我根本不熟悉Haxe。但是,我会回答说这里描述的内容听起来与我在.NET中学习的方式非常相似,所以听起来这对我来说是好的做法。

在.NET中,当用户单击某个按钮执行某些操作(如登录)时会触发“事件”,然后执行一个方法来“处理”该事件。

总会有代码描述当触发另一个类中的事件时在一个类中执行的方法。它并非不必要的复杂,它必然是复杂的。在Visual Studio IDE中,大部分代码都隐藏在“设计器”文件中,所以我没有定期看到它,但是如果你的IDE没有这个功能,你必须自己编写代码

至于如何使用自定义装载程序类,我希望有人可以为您提供答案。