在开发嵌入式系统时,您会考虑"最差实践"?
我对不该做的一些想法是:
我确信那里有很多好的想法,不该做什么,让我们听听他们!
我有两个并行的继承链:
Vehicle <- Car
<- Truck <- etc.
VehicleXMLFormatter <- CarXMLFormatter
<- TruckXMLFormatter <- etc.
Run Code Online (Sandbox Code Playgroud)
我的经验是,并行继承层次结构随着它们的增长而成为一种维护问题.
即不向toXML(), toSoap(), toYAML()我的主要类添加方法.
如何在不违反关注点分离概念的情况下避免并行继承层次结构?
我在依赖注入方面相对不熟练,我想学习一些最佳实践和反模式,分别在使用DI时使用和避免.
在我永无止境的追求以"正确"的角度方式做事的过程中,我一直在阅读很多关于如何让控制器观察角度服务中的模型变化.
一些网站称在控制器上使用$ watch是完全错误的:
请勿在控制器中使用$ watch.几乎在所有情况下都很难测试并且完全没有必要.使用范围上的方法来更新手表正在更改的值.
只要你自己清理完以后其他人看起来很好:
$ watch函数本身返回一个函数,该函数在调用时解除$ watch的绑定.因此,当不再需要$ watch时,我们只需调用$ watch返回的函数.
有一些问题和其他声誉良好的网站似乎正确地说,在控制器中使用$ watch是注意角度服务维护模型中的变化的好方法.
该https://github.com/angular/angular.js/wiki/Best-Practices网站,我想我们可以给多一点的重量,直接说是$范围.$手表应该更换事件的需要.但是,对于处理超过100个模型和REST端点的复杂SPA,选择使用$ watch来避免事件$broadcast/$emit可能最终导致大量手表.另一方面,如果我们不使用$ watch,对于非平凡的应用程序,我们最终会产生大量的意大利面条.
这是一个输/输的情况吗?这是事件和手表之间的错误选择吗?我知道你可以在很多情况下使用双向绑定,但有时你只需要一种方法来监听变化.
编辑
Ilan Frumer的评论让我重新思考我的要求,所以也许不仅仅是询问在控制器中使用$ watch是否主观好/坏,让我用这样的方式提出问题:
哪种实现可能会首先造成性能瓶颈?让控制器监听事件(必须已经广播/发出),或者$watch在控制器中设置-es.请记住,大型应用程序.
哪个实现首先会引起维护问题:$watch-es或事件?可以说,无论哪种方式都存在耦合(紧密/松散)......事件观察者需要知道要监听什么,而且$watch- 外部值(如MyDataService.getAccountNumber())需要知道在$ scope范围之外发生的事情.
**一年后编辑**
自从我提出这个问题以来,Angular已经改变/改进了很多,但我仍然得到+ 1,所以我想在提到角度团队的代码时会提到这一点,我看到了控制器中观察者的模式(或者有一个范围被销毁的指令):
$scope.$on('$destroy', $scope.$watch('scopeVariable', functionIWantToCall));
这需要$ watch函数返回的内容 - 可以调用以取消注册观察者的函数 - 并在控制器被销毁时将其提供给事件处理程序.这会自动清理观察者.
无论控制器中的手表是否具有代码味道,如果您使用它们,我相信角度团队对此模式的使用应该作为如何使用它们的强烈建议.
谢谢!
下个月,我将参与一个新的研发项目,该项目将采用函数式编程语言(我投票支持Haskell,但现在F#得到了更多的共识).现在,我已经使用过这些语言一段时间了,并用它们开发了一些命令行工具,但这是一个非常大的项目,我正在努力提高我的函数式编程知识和技术.我也阅读了很多关于这个主题的内容,但是我找不到任何记录功能编程领域反模式的书籍或资源.
现在,了解反模式意味着要了解其他聪明人的失败:在OOP中我知道其中的一些,而且我有足够的经验可以明智地选择通常是反模式的东西,完全符合我的需要.但我可以选择这个,因为我知道其他聪明人所吸取的教训.
因此,我的问题是:函数式编程中是否有任何记录的 反模式?直到现在,我的所有同事告诉我他们不知道,但他们不能说明原因.
请 不要在列表中转换这个问题:这是一个布尔问题,只需要一个证明来评估答案.例如,如果你是Oleg Kiselyov,"是"就足够了,因为每个人都能找到你关于这个主题的文章.不过,请慷慨.
请注意,我正在寻找正式的反模式,而不是简单的坏习惯或不良做法.
...... 必须至少有两个关键要素才能正式区分实际的反模式和简单的坏习惯,不良做法或坏主意:
- 一些重复的行动模式,过程或结构最初似乎是有益的,但最终会产生比有益结果更糟糕的后果,并且
- 存在一种明确记录的替代解决方案,在实际操作中得到证实并且可重复.
此外,通过"记录",我的意思是来自权威作者或众所周知的来源.
我习惯的语言是:
但我也可以调整其他功能语言中记录的反模式知识.
我在网上搜索了很多,但我发现的所有资源都与OOP或函数布局相关(在函数开头定义变量等等).
我试图弄清楚我将Akka传递ActorRef给其他演员的用法是不是反模式.
我的系统里有几个演员.有些人长寿(restClientRouter,publisher),有些人在完成工作后死亡(geoActor).短命的演员需要向长寿演员发送信息,因此需要他们ActorRef的.
//router for a bunch of other actors
val restClientRouter = createRouter(context.system)
//publishers messages to an output message queue
val publisher: ActorRef = context.actorOf(Props(new PublisherActor(host, channel)), name = "pub-actor")
//this actor send a message to the restClientRouter and then sends the response
//to the publisher
val geoActor = context.actorOf(Props(new GeoInferenceActor(restClientRouter, publisher)), name = "geo-inference-actor")
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我将ActorRefs(restClientRouter和publisher)传递给了构造函数GeoInferenceActor.这样可以吗?有没有更好的方法呢?
作为一个Git新手,我意识到我一直在使用它,好像它是Subversion.例如,总是在master上工作,而不是在拉动更改之前在本地提交.这通常会导致可避免的手动合并情况.使用Git的其他常见反模式有哪些?
我在一个Web应用程序框架中工作,其中一部分由许多服务组成,都是作为单例实现的.它们都扩展了一个Service类,其中实现了单例行为,看起来像这样:
class Service {
protected static $instance;
public function Service() {
if (isset(self::$instance)) {
throw new Exception('Please use Service::getInstance.');
}
}
public static function &getInstance() {
if (empty(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我有一个名为FileService的类实现如下:
class FileService extends Service {
// Lots of neat stuff in here
}
Run Code Online (Sandbox Code Playgroud)
...调用FileService :: getInstance()不会像我想要的那样产生FileService实例,而是一个Service实例.我假设这里的问题是Service构造函数中使用的"self"关键字.
还有其他方法来实现我想要的东西吗?单例代码只有几行,但我仍然希望尽可能避免任何代码冗余.