在我的具体情况下,我通过嵌套的视图控制器向下传递一个“facebook”对象(即MonoTouch.FacebookConnect.Facebook的一个实例),它正在为项目添加一些不错的代码.在AppDelegate中实例化后,对象始终只有一个实例,它在应用程序的大多数视图控制器中使用.所有利用facebook对象的视图控制器在开头都有这样的东西:
public class MyViewController : UIViewController
{
Facebook facebook;
public MyViewController (Facebook facebook)
{
this.facebook = facebook;
}
// ...
}
…除了顶层视图控制器,实例化对象.
还有一种情况是它通过一个嵌套的视图控制器“通过”,只是为了将它带到一个使用它的更深层嵌套的视图控制器.
我知道单身人士通常不赞成并反对OOP原则.我希望代码易于维护.我是采取正确的方法还是单身人士在不影响代码质量的情况下做到这一点?
解决方法:
我会不惜一切代价避免使用辛格尔顿.您的方法鼓励松散耦合,并允许您通过模拟对象来增加可测试性(如果您从具体实现中转换它).它通常会添加更多代码,但您应该在应用程序中具有更好的可测试性.这允许您使用IoC容器并使用依赖注入.网上有很多很棒的文章和帖子,这里有关于这些主题的StackOverflow.
也许你的单身人士可能是这样的:
public class MyViewController : UIViewController
{
public MyViewController ()
{
}
public void Foo()
{
FaceBookSingleton.Instance.DoSomeAction();
FaceBookSingleton.Instance.Something = 4;
}
}
你如何围绕Foo()进行测试?如果你引入了一个突破性的变化,你怎么知道呢?你怎么知道你的依赖图是什么样的?测试这样的代码更难.不要指望浏览代码库的人试图弄清楚他们是否破坏了某些东西.通过编写可以测试的代码来帮助他们和自己.
现在可以看一下这样的事情:
public interface ISocialMediaWidget
{
ISocialMediaWidgetResponse DoSomeUnitOfWork();
}
public class ConcreteSocialMediaWidgetService
{
protected readonly ISocialMediaWidget socialMediaWidget;
public ConcreteSocialMediaWidgetService(ISocialMediaWidget widget)
{
this.socialMediaWidget = widget;
}
public ISocialMediaWidgetResponse Foo()
{
return socialMediaWidget.DoUnitOfWork();
}
}
围绕上述内容编写测试要容易得多.您还可以模拟每个接口的响应以创建各种测试.
public void SocialMediaWidgetTest()
{ //pseudo code
var testService = new MockObject(ConcreteSocialMediaWidgetService(MockObject_of_ISocialMediaWidget));
Assert.Equals(someImplementation_of_ISocialMediaWidgetResponse, testService.Foo());
}
原文地址:https://codeday.me/bug/20190718/1493484.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。