作为编程的初学者,当我遇到墙壁时,它总是让我烦恼。 目前其中一堵墙是相互依存的对象。
正如您在我的问题历史记录中看到的那样,我目前正在开发一个黑莓应用程序,我在其中实现了一个我称之为 MVC 模式的东西,但它并不是我想的那样。
你看,一个新手程序员看到这张图这样的摘要,你就会明白它背后的想法。但实现它是另一回事。
alt text http://www.ibm.com/developerworks/wireless/library/wi-arch6/theoretical.gif
请不要停止阅读 :) 我正在向您展示一些我的代码,其中包含一些黑莓特定的东西,但您应该看看我在做什么。
我的应用程序的主要入口点
public class ContactManager extends UiApplication
{
private static ContactManagerMainScreenModel MainScreenModel = new ContactManagerMainScreenModel();
private static ContactManagerMainScreen MainScreenView = null;
public static void main(String[] args)
{
new ContactManager().enterEventDispatcher();
}
public ContactManager()
{
MainScreenView = new ContactManagerMainScreen(MainScreenModel);
// Displays the Splashscreen then opens the Mainscreen
new SplashScreen(UiApplication.getUiApplication(), MainScreenView);
}
}
主屏幕模型
public class ContactManagerMainScreenModel
{
ContactManagerMainScreen v;
// Loading Local Storage
LocalContactStorage LocalContactStorage = new LocalContactStorage();
// Define Data List
private Vector vContacts_Favorites;
public void register(ContactManagerMainScreen v)
{
this.v = v;
}
// Retrieve Favorite Contacts from Persistant Storage
public Vector getFavoriteContactsFromLocalStorage()
{
vContacts_Favorites = LocalContactStorage.getFavoriteContactsFromLocalStorage();
return vContacts_Favorites;
}
// Put Retrieve Favorite Contacts from Persistant Storage
public void saveFavoriteContactsToLocalStorage()
{
LocalContactStorage.saveFavoriteContactsToLocalStorage(vContacts_Favorites);
}
}
主屏幕 Controller
public class ContactManagerMainScreenController
{
private ContactManagerMainScreenModel _model = null;
private ContactManagerMainScreen _view = null;
public ContactManagerMainScreenController(ContactManagerMainScreen view, ContactManagerMainScreenModel model)
{
this._model = model;
this._view = view;
}
public void HideFavoriteList()
{
if( this._view._ContactList.getManager() != null)
{
this._view._ContactList.getManager().delete(this._view._ContactList);
} else
{
this._view._bottom_box.add(this._view._ContactList);
}
}
}
还在吗?好的……
我的问题是,我想使用 Controller 来更改 UI 元素,例如显示弹出框、隐藏某些内容或其他内容。
但是所有这些 UI 元素都是在 View (此处为 ContactManagerMainScreen)中定义的,因此必须向 Controller 提供对 View 的引用。这导致了我相互依赖的对象的痛苦。
我无法在声明 View 之前创建 Controller 。如果不需要允许 Controller 更改 UIElements,那将是没有问题的(如图所示)。
我现在做的是View创建Controller
controller = new ContactManagerMainScreenController(this , model);
这有意义吗?我想了解这种模式,所以称我的代码为垃圾或任何你喜欢的东西:)我只是想学习一些东西。
附言请原谅我的英语不好:)
最佳答案
MVC 是一个有趣的抽象,但存在一些问题。
在现实中, Controller 和 View 通常是配对的——尽管理论上您应该能够在没有另一个的情况下替换其中一个,但实际上不同 View 的接口(interface)机制是如此不同,以至于 Controller 和 View 是结合在一起的。
我见过的关于 Java 的最好描述是 View 是您的 swing 组件,因此您的 View 代码部分只是将这些组件放在屏幕上。
您的 Controller 是该类的其余部分、监听器以及与 View 交互的其余代码。
我的建议是不要太担心隔离 View 和 Controller ,但话虽如此,我完全支持在模型和 View / Controller 之间保持非常牢固的分离。
编辑/高级: 我使用了一种模式,其中 Controller 和 View 是隔离的,它更灵活,但往往需要更多的工作。我认为 Struts 使用绑定(bind)模型——如果您想了解一些抽象技术,您可以去那里看看或搜索有关“绑定(bind)”swing 控件的内容。
关于Java MVC - 感觉我不明白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1120334/
在Ruby1.9.1中,如果你这样做$VERBOSE=trueputs/m/,42.to_s或者如果我这样做$VERBOSE=trueputs/m/,"42"你收到警告warning:ambiguousfirstargument;putparenthesesorevenspaces但我不明白$VERBOSE=trueputs"m",42.to_s或$VERBOSE=trueputs(/m/,42.to_s)那么具体是什么触发了这个警告?我还可以在原始表达式中添加哪些空格? 最佳答案 “问题”是/可以表示除法或正则表达式。该消息是通用
我正在努力解决对象中的错误,但完全不确定问题出在哪里。这是模型的样子:classCar:car_colorsendclassCarColor:car_colorsend这里是查询:@cars=Car.all(:joins=>:car_colors,:conditions=>{:car_colors=>{:color_id=>params[:id_number]}},:order=>"cars.created_atDESC")错误输出:PG::Error:ERROR:columnreference"created_at"isambiguousLINE1:...d"WHERE"car_co
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我正在寻找Ruby的CodeLikeaPythonista:IdiomaticPython等价物理想的特性:易于阅读涵盖所有主题的单一文档:提示、技巧、指南、注意事项和陷阱比一本书还小惯用语应该在标准发行版中开箱即用(%sudoapt-getinstallrubyirbrdoc)请尽可能为每个答案放一个教程,并附上教程中的示例代码及其含义。更新:这些
在这个例子中,deffoo(x)if(x>5)bar=100endputsbarend然后foo(6)输出:100而foo(3)什么也不输出。但是,如果我将定义更改为deffoo(x)if(x>5)bar=100endputsbobend我收到“未定义的局部变量或方法”错误。所以我的问题是为什么当我调用foo(3)并且从未设置bar时我没有收到此错误? 最佳答案 这里发生了几件事。首先,在ifblock内声明的变量与在方法的顶层声明的变量具有相同的局部作用域,这就是为什么bar在if之外可用的原因。其次,您收到该错误是因为bob被突
我正在使用的插件中有一行我试图理解:$self.hide().attr("src",$self.data(settings.data_attribute))[settings.effect](settings.effect_speed);self是一个jquery对象,在这段代码中是一个imgdom元素,它隐藏了它,然后将这个img对象的src属性设置为html5的data-attribute。但现在它访问.attr(返回的jquery对象中的一个属性,在这个中是“淡入”。但我不明白,jquery对象是否具有内置在jquery对象中内置效果属性函数的地方?我很困惑这是如何转换为调用.f
假设我们已经在全局范围内定义了这个函数:functioncreateCounter(){varcounter=0;functionincrement(){counter=counter+1;console.log("Numberofevents:"+counter);}returnincrement;}在大多数解释闭包的例子中,我看到执行:createCounter();从全局范围只会返回内部函数:functionincrement(){counter=counter+1;console.log("Numberofevents:"+counter);}现在完全有道理了,因为create
如果用户的浏览器是IE,并且localStorage不存在,下面的代码设置一个localStorage,它的有效期为24小时。(functionieAlert(){varlastclear=window.localStorage.getItem('myLocalStorage'),time_now=(newDate()).getTime();varisIE=document.documentModeif(isIE&&!lastclear){if((time_now-lastclear)>1000*60*60*24){window.localStorage.clear()window.l
Crockford有这个例子来防止myArray在全局范围内:varmyName=(function(){varmyArray=['zero','one','two','three','four'];returnfunction(X){returnmyArray[X];}}());//Thisfunctionisinvokedimmediatelyresult=myName(3);//Nowinvokeit"forreal"问:我不明白为什么不是varmyName=(function(X){问:当我调用myName(3)时,"varmyArray="不是执行了第二次吗?假设它没有第二次
我不明白这段代码:functionms(){varplc=unescape('".unescape('\x43\x43\x43\x43\n.............\xEF'.$URL).CollectGarbage();if(mf)return(0);mf=1;varhsta=0x0c0c0c0c,hbs=0x100000,pl=plc.length*2,sss=hbs-(pl+0x38);varss=gss(addr(hsta),sss),hb=(hsta-hbs)/hbs;for(i=0;i在上面的函数中,我似乎无法弄清楚变量类型,或者弄清楚它对hsta变量做了什么,以及它分配给
我正在学习golang,对于将一个函数作为参数传递给另一个函数的代码,我不知道我列出的代码的含义对于quote123函数,它需要一个函数作为参数,如何将部分:func(xint)string{returnfmt.Sprintf("%b",x)}传递给quote123函数,即使这样有效,如果那部分返回一个字符串,这个字符串不应该是函数quote123的参数//converttypestakeanintandreturnastringvalue.typeconvertfunc(int)string//valueimplementsconvert,returningxasstring.fun