我们已经尝试在最近的项目中引入单元测试前端逻辑,并且测试的价值受到质疑.
我们没有对代码进行代码审查,因此它们的质量很差,开发人员复制了不良测试,创建了更糟糕的测试,因此我们进行了大量的垃圾测试.
我仍然相信测试演示者(我们使用MVP)是有价值的,但让人们参与其中比我原先想象的要困难得多.
我怎样才能让人们认为前端测试是有价值的,有没有人有任何好的资源指向我,支持我这个?
谢谢...
MVC模式中的控制器和MVP模式中的演示者之间有什么区别?您能否提供链接以了解这两者的优点和使用方案?
我正在努力熟悉GWT开发的"地点和活动"设计模式,到目前为止我认为它有很大的潜力.我特别喜欢这样一种方式,一旦你开始考虑你的应用程序的"地方",浏览器历史几乎只是在你的大腿上,几乎没有额外的努力.
然而,有一件事让我感到困扰:到目前为止我看到的所有文章和代码示例都掩盖了一个(就我而言,主要的)方面:'MVP'的'M'部分,即模型!
在普通的MVP架构中,据我所知,Presenter拥有对Model的引用,并负责根据UI事件更新它,或者根据Model更改更新UI.
现在,在"P&A"的所有文章/样本中,活动似乎取代了Presenter,但与"普通"主持人不同,他们会在新地方到达时被丢弃并重新创建,因此他们可以'是存储客户端状态的那个,或者每次都会丢失.活动起来很便宜,所以这不是一件麻烦事,但我不想一遍又一遍地创建复杂应用程序的模型.
所有样本都相当简单,并且没有太多的状态,因此只是忽略了Model方面,但是实际的,复杂的应用程序在哪里存储它的状态?
我有一个快速的问题.我正在努力(并努力)用MVP设计模式设计我的应用程序.
我可以问,对于每个视图(活动,片段)我应该有一个单独的演示者类吗?
我在网上看到的资源并不多,显然有样本说明了MVP.如果他们有一些人可以共享吗?
PS我也在这个应用程序中使用RecyclerViewAdapter所以任何关于它的指针将不胜感激
提前致谢
我试图围绕C#/ Winforms应用程序中使用的MVP模式.所以我创建了一个简单的"记事本",就像应用程序一样,试图找出所有细节.我的目标是创建一些东西来执行打开,保存,新的经典窗口行为,以及在标题栏中反映已保存文件的名称.此外,当有未保存的更改时,标题栏应包含*.
所以我创建了一个视图和一个管理应用程序持久性状态的演示者.我考虑过的一个改进是打破文本处理代码,以便视图/展示者真正是一个单一用途的实体.
这是一个参考屏幕截图...

我在下面列出了所有相关文件.我对我是否以正确的方式完成它或者是否有改进方法的反馈感兴趣.
NoteModel.cs:
public class NoteModel : INotifyPropertyChanged
{
public string Filename { get; set; }
public bool IsDirty { get; set; }
string _sText;
public readonly string DefaultName = "Untitled.txt";
public string TheText
{
get { return _sText; }
set
{
_sText = value;
PropertyHasChanged("TheText");
}
}
public NoteModel()
{
Filename = DefaultName;
}
public void Save(string sFilename)
{
FileInfo fi = new FileInfo(sFilename);
TextWriter tw = new StreamWriter(fi.FullName);
tw.Write(TheText);
tw.Close();
Filename = fi.FullName;
IsDirty = …Run Code Online (Sandbox Code Playgroud) 当我使用WinForm时,我正在使用MVP.但是当我开始使用WPF或Silverlight时,我转向了MVVM.
我注意到的唯一事情是,由于强大的绑定,我们不需要在MVVM模式中同步View和ViewModel之间的数据.
我的问题是:
1)绑定(这有助于我们不手动同步View和ViewModel)使用MVVM的唯一优势是什么?
2)MVVM相对于MVP还有其他优势吗?有什么区别?
3)下面的代码是MVVP模式还是MVVM或两者兼而有之?
interface IView {
void ShowMessage(string message);
}
class View : IView {
public void ShowMessage(string message){
MessageBox.Show(this, message);
}
}
class ViewModel{
private IView view;
public ViewModel(IVew view){
this.view = view;
}
........
view.ShowMessage("This is a msg");
}
Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用mvp4g框架构建GWT/Google App Engine Web应用程序.
我一直收到错误的错误,无法通过延迟绑定创建我的服务实例.
我的Acebankroll.gwt.xml文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<module rename-to='acebankroll'>
<inherits name='com.google.gwt.user.User'/>
<inherits name="com.google.gwt.i18n.I18N"/>
<inherits name='com.google.gwt.user.theme.standard.Standard'/>
<inherits name='com.mvp4g.Mvp4gModule'/>
<entry-point class='com.softamo.acebankroll.client.AceBankroll'/>
<source path='client'/>
</module>
Run Code Online (Sandbox Code Playgroud)
我的入门模块如下:
public class AceBankroll implements EntryPoint {
public void onModuleLoad() {
Mvp4gModule module = (Mvp4gModule)GWT.create( Mvp4gModule.class );
module.createAndStartModule();
RootPanel.get().add((Widget)module.getStartView());
}
}
Run Code Online (Sandbox Code Playgroud)
我发布完整的错误跟踪作为答案.
我已经读过,下一个常见错误列表可能会导致此错误:
ServiceAsync接口具有返回值的方法.这是错误的,所有方法都需要返回void.
Service接口不扩展RemoteService接口.
ServiceAsync接口中的方法错过了AsyncCallback的最后一个参数.
两个interfaced,ExampleService和ExampleServiceAsync上的方法不完全匹配(除了返回值和AsyncCallback参数)
我检查了上述所有条件,但未发现问题.
这是一个片段,说明我如何在演示者类中注入服务.
protected MainServiceAsync service = null;
@InjectService
public void setService( MainServiceAsync service ) {
this.service = service;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Swing GUI编写实用程序.我正在尝试使用Martin Fowler的演示模型来促进测试.我的应用程序将使用java.util.prefs.Preferences(即:主窗口位置和大小)自动存储多个用户首选项.我花了几个小时在周末试图创建一个PreferencesAPI 的Clojure模拟(使用EasyMock),以便我可以测试我的演示者代码,但无法使其工作.使用非OO风格的Clojure GUI编程对于长期的OO程序员来说很难.我觉得如果我能发现/开发这些东西的模式(模拟,视觉"类"的"接口"等),我可以继续在整个应用程序的其余部分使用相同的模式.
我也在Scala中开发相同的应用程序来比较编程模式并发现它更加直观,即使我试图以相当严格的函数风格使用Scala(当然不包括调用Java类,如Swing API - 它在Clojure版本中具有相同的可变性问题,但当然也将是单线程的).
在我的Scala代码中,我创建了一个名为MainFrame扩展JFrame并实现特征的类MainView.MainView将所有JFrame调用公开为抽象方法,我可以在模拟对象中实现:
trait LabelMethods {
def setText(text: String)
//...
}
trait PreferencesMethods {
def getInt(key: String, default: Int): Int
def putInt(key: String, value: Int)
//...
}
trait MainView {
val someLabel: LabelMethods
def addComponentListener(listener: ComponentListener)
def getLocation: Point
def setVisible(visible: Boolean)
// ...
}
class MainFrame extends JFrame with MainView {
val someLabel = …Run Code Online (Sandbox Code Playgroud) 我想知道asp.NET MVC和MVP之间的区别,它们是否相同?下面是我提到的架构图.
(图片网址:http://msdn.microsoft.com/en-us/library/ff647859.aspx)

我从图中看到MVC和MVP之间的主要区别是,在MVC中模型更新视图,在MVP中,Presenter更新视图.
但这是我的困惑.Below是一个asp.net MVC代码示例.
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
这里Controller返回/更新视图,所以现在根据图表它是MVP
asp.net mvc和MVP是否相似?如果没有什么区别?有人可以指导我.
在我的Android项目中,我使用realm作为我的数据存储引擎.我喜欢它!
我也使用RxJava,因为它使"线程化"变得如此简单,我真的很喜欢整个"反应性思维".我喜欢它!
我使用MVP模式+一些"清洁架构"的想法来构建我的应用程序.
我Interactors是唯一知道的人Realm.我在Observable的帮助下公开数据,如下所示:
@Override
public Observable<City> getHomeTown() {
final Realm realm = Realm.getDefaultInstance();
return realm.where(City.class).equalTo("name", "Cluj-Napoca").findAllAsync().asObservable()
.doOnUnsubscribe(new Action0() {
@Override
public void call() {
realm.close();
}
})
.compose(new NullIfNoRealmObject<City>());
}
Run Code Online (Sandbox Code Playgroud)
问题是我doOnUnsubscribe的副作用被调用之前Realm可以做它的事情,处理暴露的observable:
Caused by: java.lang.IllegalStateException: This Realm instance has already been closed, making it unusable.
at io.realm.BaseRealm.checkIfValid(BaseRealm.java:344)
at io.realm.RealmResults.removeChangeListener(RealmResults.java:818)
at io.realm.rx.RealmObservableFactory$3$2.call(RealmObservableFactory.java:137)
at rx.subscriptions.BooleanSubscription.unsubscribe(BooleanSubscription.java:71)
at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:124)
at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:113)
at rx.Subscriber.unsubscribe(Subscriber.java:98)
at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:124)
at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:113)
at rx.Subscriber.unsubscribe(Subscriber.java:98)
at rx.subscriptions.CompositeSubscription.unsubscribeFromAll(CompositeSubscription.java:150)
at …Run Code Online (Sandbox Code Playgroud)