我正在寻找适合我的应用程序设计的设计模式.
我的应用程序处理大量数据并生成一些图表.数据处理(从文件中获取,CPU密集型计算)和图形操作(绘图,更新)在单独的线程中完成.
图表可以滚动 - 在这种情况下,需要处理新的数据部分.因为图形上可以有多个系列,所以可以生成多个线程(每个系列有两个线程,一个用于数据集更新,一个用于图形更新).
我不想创建多个进度条.相反,我希望有一个单一的进度条来告知全球进展.目前我可以想到MVC和Observer/Observable,但它有点模糊:)也许有人可以指出我正确的方向,谢谢.
model-view-controller multithreading decoupling observer-pattern progress-bar
我刚刚在NDC观看了Bob Martin的一集,他说在页面顶部的C#中使用"using"指令很糟糕,因为它们在组件之间创建/暗示紧密耦合.
在没有添加项目引用和using语句的情况下,有什么方法可以使用外部.dll?
我记得V6曾经让你通过ProgId的字符串创建一个对象 - 我不确定这是我正在寻找的技术,但它是一个不需要项目引用的语言示例DLL.
编辑:这是会议的链接.对不起我在演讲中没有确切的引用或分钟,我记得.
这应该是一个相当简单的问题,但我似乎无法在互联网上找到一个好的答案.
我一直在研究Java FX,我发现它很有趣,尽管我很难满足于如何设法将逻辑与程序的表示分开.
注意:这可能是
Controller.java文件中可能重复的Javafx 2.0操作方法Application.getParameters()
但是在接受的答案中的建议是将变量设置为静态,我也不希望这样做.
我发现的所有教程都有一个控制器,它应该是good'ol MVC方式中表示和逻辑之间的连接.然而,在这里,我发现自己磕磕绊绊,因为我不想初始化一些东西,在这种情况下不重要的东西,并将其传递给我的控制器.
我是否应该将内容传递给我的控制器,还是应该负责初始化(通过自身或通过实例化另一个具有该责任的对象)?
我想在Java FX中将内容传递给我的控制器,我应该这样做还是不好的做法?如果我应该传递东西,我该怎么做?
主要课程
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("ChatGUI.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
Run Code Online (Sandbox Code Playgroud)
和示例控制器(带注释)
@Override
public void initialize(URL url, ResourceBundle rb) {
//Intialize a bunch of stuff here.
connectionManager = new MyConnectionManager();
}
Run Code Online (Sandbox Code Playgroud)
以及我想做的事情:
主要课程
@Override
public void start(Stage stage) throws Exception {
Parent …Run Code Online (Sandbox Code Playgroud) 我不明白"对象类之间的CBO耦合"究竟意味着什么.我发现的定义太短了,我觉得我错过了一些东西,所以如果你帮我举个例子会很棒.
这是我发现的定义:"对象类之间的耦合是它所耦合的其他类的数量的计数."
提前致谢.
考虑类之间的以下关系:
int main(int, char**) { | class Window { | class Layout { | class Box {
/* Use argc/argv */ | Layout layout; | Box box; | int height,
Window window; | | | max_width;
} | bool print_fps; | public: |
| | Layout(); | public:
| public: | }; | Box (int,int);
| Window (); | | };
| }; | |
Run Code Online (Sandbox Code Playgroud)
我为了简单起见构建了这个结构,实际上还有更多的类.
在main()我获取一些应用程序参数(通过配置文件,数据库,CLI参数).现在我想将这些值传递给所需的对象.
我的问题:哪些是最好/最优雅的方法来"破墙",以便我可以"抛出"配置和谁需要它"抓住"它?
最初,我"打开了一些门",并为 …
对于依赖注入,我理解我必须将一个类的实例传递给主实例而不是主类创建它自己的实例,就像这样(php):
class Class_One {
protected $_other;
public function setOtherClass( An_Interface $other_class ) {
$this->_other_class = $other_class;
}
public function doWhateverYouHaveToDoWithTheOtherClass() {
$this->_other_class->doYourThing();
}
}
interface An_Interface {
public function doYourThing();
}
class Class_Two implements An_Interface {
public function doYourThing() { }
}
class Class_Three implements An_Interface {
public function doYourThing() { }
}
// Implementation:
$class_one = new Class_One();
$class_two = new Class_Two();
$class_three = new Class_Three();
$class_one->setOtherClass( $class_two );
$class_one->doWhateverYouHaveToDoWithTheOtherClass();
$class_one->setOtherClass( $class_three );
$class_one->doWhateverYouHaveToDoWithTheOtherClass();
Run Code Online (Sandbox Code Playgroud)
这一切都很好.我知道,由于Class_Two和Class_Three都实现了An_Interface,因此它们可以在Class_One中互换使用.Class_One不会知道它们之间的区别.
我的问题是,不是将实例传递给setOtherClass,而是传递一个字符串,如"Class_Two",并让Class_One的setOtherClass方法实际创建实例本身,这是一个好主意:
class Class_One { …Run Code Online (Sandbox Code Playgroud) 我有一个问题似乎无法在任何地方得到解答.这是关于将代码与接口分离的问题.问题是 - 是否应将其他对象(正在创建和使用)中的所有对象重构为接口以遵循SOLID的依赖性反转原则?那么在偶数驱动方法中新建对象怎么样?我按下按钮时调用的方法.是否应该传递对象,比如说构造函数?当然这一切都适用于我的对象,而不是BCL吗?
我有一个php应用程序,它使用一个Listener类,它基本上只是用jquery设置一个ajax请求(下面的例子).但由于某种原因,回应javascript似乎不够优雅.更好的做法是为要传递的javascript(可能引入耦合)构建单例类,还是像我现在正在做的那样回显脚本?
这是我正在做的代码片段.
<?php
$script = "
<script>
$(document).ready(function(){
$('".$trigger."').".$action."(function() {
".$js_variables."
var ajax_load = '';
var loadUrl = '".$this->controller_path."';
var action = $(this).attr('id');
$('".$this->parent."')
.hide(2)
.html(ajax_load)
.load(loadUrl, {action: action, ".$post_mapper."})
.fadeIn(800);
});
});
</script>
";
echo $script;
?>
Run Code Online (Sandbox Code Playgroud)
编辑:使用单例类也允许我只使用$(document).ready()或快捷版本$(function(){})一次,而不是每次添加一个监听器.但我不确定这是否值得花费额外的时间和精力......任何想法?
我有两个耦合的类DhcpServer和SessionManager.我的规格中有以下要求导致了这种耦合:
DhcpServer如果SessionManager禁止(例如创建会话时发生错误),则不得发出IP地址租约SessionManager必须在创建新租约时启动会话,DhcpServer并在租约到期或客户明确释放后立即销毁会话DhcpServer,如果SessionManager停止相应的会话,必须销毁租约(例如,通过系统管理员的请求)起初,很容易将所有代码放入一个类中.但责任是不同的,所以我将它们分成两个并创建了两个接口:
class ISessionObserver(object):
def onSessionStart(**kwargs): pass
def onSessionStop(**kwargs): pass
class IDhcpObserver(object):
def onBeforeLeaseCreate(**kwargs):
"""
return False to cancel lease creation
"""
pass
def onLeaseCreate(**kwargs): pass
def onLeaseDestroy(**kwargs): pass
Run Code Online (Sandbox Code Playgroud)
然后,我实现了IDhcpObserver在SessionManager和ISessionObserver中DhcpServer.这导致了耦合.即使类不直接相互依赖,它们依赖于彼此包中声明的接口.
后来我想为会话启动添加另一个协议,SessionManager保持逻辑不变.我也不希望它也能实现IAnotherProtocolObserver.
此外,DHCP服务器与我的会话概念无关.由于Twisted(我正在使用)没有DHCP协议实现,我想将它作为一个单独的项目发布,它既没有依赖也没有依赖SessionManager它的包.
如何在保持代码片松散耦合的同时满足我的规范要求?
我正在开发一个由3个主要部分组成的Android测试项目,每个部分都是按照MVP模式开发的.这些部分互相嵌套,我想知道我所遵循的策略是否正确/最好
结构体:
每个部分都使用MVP结构(例如,对于Book I制作了BookPresenter,BookView和BookModel,对于Page和Item也是如此)
作为用户案例,我想跟踪用户点击按钮的次数,并且每次将页面背景更改为随机颜色,当用户到达第10次点击时,告诉BookPresenter转到第二页.
为此我设置了这样的东西
在所有这些中,BookPresenter具有对PagePresenter的引用,并且PagePresenter具有对ItemPresenter的引用,因此当需要执行某些操作时,它们可以与结构中的子或父呈现器进行通信.
现在的问题 是:这是建立具有嵌套MVP的系统的正确方法吗?因为如果我想要一个PageView而不是在Book中我需要将它放在一个Newspaper(其他具有Book的替代行为的类)中,我仍然需要使用Presenters和其他所有其他类重新创建依赖关系链. ...
decoupling ×10
architecture ×2
c# ×2
coupling ×2
php ×2
android ×1
android-mvp ×1
c++ ×1
interface ×1
java ×1
javafx-2 ×1
jquery ×1
mvp ×1
oop ×1
progress-bar ×1
python ×1