已经发布了几个关于依赖注入的具体问题的问题,例如何时使用它以及它有哪些框架.然而,
什么是依赖注入以及何时/为什么应该或不应该使用它?
language-agnostic design-patterns dependency-injection terminology
当超越RAD(拖放和配置)构建用户界面的方式时,许多工具鼓励您可能会遇到三种设计模式,称为模型 - 视图 - 控制器,模型 - 视图 - 展示器和模型 - 视图 - 视图模型.我的问题有三个部分:
model-view-controller mvp user-interface glossary design-patterns
静态类和单例模式之间存在什么真实(即实际)差异?
两者都可以在没有实例化的情况下调用,两者都只提供一个"实例",它们都不是线程安全的.还有其他区别吗?
控制反转(或IoC)在第一次遇到时会非常混乱.
标准的"模型视图控制器"模式与Microsoft的模型/视图/ ViewModel模式之间是否存在差异?
很久以前我读过一篇文章(我相信一篇博客文章),它让我在命名对象的"正确"轨道上:非常谨慎地命名程序中的东西.
例如,如果我的应用程序(作为一个典型的业务应用程序)处理用户,公司和地址我有一个User
,一个Company
和一个Address
域类 - 可能在某个地方UserManager
,一个CompanyManager
和一个AddressManager
会弹出来处理这些事情.
所以,你可以告诉那些UserManager
,CompanyManager
和AddressManager
做什么?不,因为Manager是一个非常通用的术语,适用于您可以对域对象执行的任何操作.
我读过的文章建议使用非常具体的名称.如果它是一个C++应用程序并且该UserManager
工作正在分配并从堆中释放用户,那么它将不会管理用户,而是保护他们的出生和死亡.嗯,也许我们可以称之为UserShepherd
.
或者可能UserManager
的工作是检查每个User对象的数据并以加密方式对数据进行签名.然后我们有一个UserRecordsClerk
.
现在这个想法一直困扰着我,我尝试应用它.并且发现这个简单的想法非常难.
我可以描述这些类的功能和(只要我不进入快速和脏编码)我写的类只做一件事.我想念从名称到名称的是一种名称目录,一种将概念映射到名称的词汇表.
最终,我想在我的脑海里有类似图案目录的东西(通常设计图案很容易提供对象名称,例如工厂)
保姆 - 帮助对象在创建后达到"可用"状态 - 例如通过连接到其他对象
等等
那么,你如何处理这个问题呢?你有一个固定的词汇表,你是否动态发明新的名字,或者你认为命名的东西不是那么重要或错误?
PS:我也对链接到讨论这个问题的文章和博客感兴趣.首先,这是让我思考它的原始文章:在没有"经理"的情况下命名Java类
以下是我在此期间从这个问题中学到的内容的一些总结.
关于这个主题的进一步文章/书籍:
以及我从答案中收集的主观名称前缀/后缀的当前列表:
自从我去年开始学习F#和OCaml以来,我已经阅读了大量的文章,这些文章坚持认为设计模式(特别是Java)是命令式语言中缺少的功能的变通方法.我发现的一篇文章提出了相当强烈的主张:
我遇到过的大多数人都读过Gang of Four的"设计模式"一书.任何自尊的程序员都会告诉你,这本书与语言无关,而且无论你使用哪种语言,这些模式都适用于软件工程.这是一个崇高的主张.不幸的是,它与事实相去甚远.
功能语言极具表现力.在函数式语言中,人们不需要设计模式,因为语言可能是如此高级,您最终会编写概念,一起消除设计模式.
函数式编程的主要特性包括作为一等值,currying,不可变值等的函数.对我来说,OO设计模式近似于任何这些特性似乎并不明显.
另外,在支持OOP的函数式语言(例如F#和OCaml)中,对我来说很明显,使用这些语言的程序员将使用与其他OOP语言相同的设计模式.事实上,现在我每天都使用F#和OCaml,我在这些语言中使用的模式与我在Java中编写时使用的模式之间没有明显的差异.
功能编程是否消除了对OOP设计模式的需求,是否有任何理由?如果是这样,您是否可以发布或链接到典型OOP设计模式及其功能等效的示例?
最近我碰到了C++的Singleton设计模式的实现/实现.看起来像这样(我从现实生活中采用了它):
// a lot of methods are omitted here
class Singleton
{
public:
static Singleton* getInstance( );
~Singleton( );
private:
Singleton( );
static Singleton* instance;
};
Run Code Online (Sandbox Code Playgroud)
从这个声明我可以推断出实例字段是在堆上启动的.这意味着存在内存分配.对我来说完全不清楚的是,什么时候内存将被解除分配?还是有漏洞和内存泄漏?好像在实施中存在问题.
我的主要问题是,如何以正确的方式实施它?