标签: anti-patterns

嵌入式系统最差的做法

在开发嵌入式系统时,您会考虑"最差实践"?

我对不该做的一些想法是:

  • 避免抽象硬件层,而是在整个代码中扩展硬件访问.
  • 没有任何类型的仿真环境,只有exe/cute的实际硬件.
  • 避免单元测试,可能是由于以上两点
  • 不在分层结构中开发系统,因此较高层可能依赖于调试和工作的较低层功能
  • 选择硬件而不考虑将使用它的软件和工具
  • 使用专为简化调试而设计的硬件,例如无测试点,无调试LED,无JTAG等.

    我确信那里有很多好的想法,不该做什么,让我们听听他们!

  • embedded anti-patterns

    39
    推荐指数
    6
    解决办法
    3917
    查看次数

    单身人士去吧

    如何在go编程语言中实现Singleton设计模式?

    singleton design-patterns anti-patterns go

    37
    推荐指数
    5
    解决办法
    2万
    查看次数

    避免并行继承层次结构

    我有两个并行的继承链:

    Vehicle <- Car
            <- Truck <- etc.
    
    VehicleXMLFormatter <- CarXMLFormatter
                        <- TruckXMLFormatter <- etc.
    
    Run Code Online (Sandbox Code Playgroud)

    我的经验是,并行继承层次结构随着它们的增长而成为一种维护问题.

    即不向toXML(), toSoap(), toYAML()我的主要类添加方法.

    如何在不违反关注点分离概念的情况下避免并行继承层次结构?

    java oop inheritance anti-patterns

    33
    推荐指数
    2
    解决办法
    4840
    查看次数

    依赖注入最佳实践和反模式

    我在依赖注入方面相对不熟练,我想学习一些最佳实践和反模式,分别在使用DI时使用和避免.

    language-agnostic dependency-injection anti-patterns

    31
    推荐指数
    2
    解决办法
    9029
    查看次数

    馄饨代码 - 为什么反模式?

    我最近遇到了一个术语" 上帝对象 ",被称为"反模式".我听说过不好的编码习惯,但我从来没有听说过它们.

    因此,我前往维基百科了解更多信息,我发现有一种称为"馄饨代码"的反模式被描述为"以许多小型(理想情况下)松散耦合的软件组件为特征".

    我很困惑 - 为什么这是一件坏事?

    anti-patterns

    30
    推荐指数
    5
    解决办法
    1万
    查看次数

    在控制器中使用angular的$ watch是反模式吗?

    在我永无止境的追求以"正确"的角度方式做事的过程中,我一直在阅读很多关于如何让控制器观察角度服务中的模型变化.

    一些网站称在控制器上使用$ 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函数返回的内容 - 可以调用以取消注册观察者的函数 - 并在控制器被销毁时将其提供给事件处理程序.这会自动清理观察者.

    无论控制器中的手表是否具有代码味道,如果您使用它们,我相信角度团队对此模式的使用应该作为如何使用它们的强烈建议.

    谢谢!

    anti-patterns angularjs

    30
    推荐指数
    1
    解决办法
    5300
    查看次数

    函数式编程是否有任何记录的反模式?

    下个月,我将参与一个新的研发项目,该项目将采用函数式编程语言(我投票支持Haskell,但现在F#得到了更多的共识).现在,我已经使用过这些语言一段时间了,并用它们开发了一些命令行工具,但这是一个非常大的项目,我正在努力提高我的函数式编程知识和技术.我也阅读了很多关于这个主题的内容,但是我找不到任何记录功能编程领域反模式的书籍或资源.

    现在,了解反模式意味着要了解其他聪明人的失败:在OOP中我知道其中的一些,而且我有足够的经验可以明智地选择通常是反模式的东西,完全符合我的需要.但我可以选择这个,因为我知道其他聪明人所吸取的教训.

    因此,我的问题是:函数式编程中是否有任何记录的 反模式?直到现在,我的所有同事告诉我他们不知道,但他们不能说明原因.

    • 如果是,请包含一个指向权威来源的链接(目录,论文,书籍或同等学历).
    • 如果不是,请用适当的定理支持你的答案.

    不要在列表中转换这个问题:这是一个布尔问题,只需要一个证明来评估答案.例如,如果你是Oleg Kiselyov,"是"就足够了,因为每个人都能找到你关于这个主题的文章.不过,请慷慨.

    请注意,我正在寻找正式的反模式,而不是简单的坏习惯或不良做法.

    来自关于反模式链接维基百科文章:

    ...... 必须至少有两个关键要素才能正式区分实际的反模式和简单的坏习惯,不良做法或坏主意:

    1. 一些重复的行动模式,过程或结构最初似乎是有益的,但最终会产生比有益结果更糟糕的后果,并且
    2. 存在一种明确记录的替代解决方案,在实际操作中得到证实并且可重复.

    此外,通过"记录",我的意思是来自权威作者众所周知的来源.

    我习惯的语言是:

    • Haskell(我真正开始认为如果代码编译,它的工作原理!)
    • 斯卡拉
    • F#

    但我也可以调整其他功能语言中记录的反模式知识.

    我在网上搜索了很多,但我发现的所有资源都与OOP或函数布局相关(在函数开头定义变量等等).

    f# haskell functional-programming scala anti-patterns

    29
    推荐指数
    1
    解决办法
    3054
    查看次数

    将ActorRef传递给其他Actors好坏?

    我试图弄清楚我将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(restClientRouterpublisher)传递给了构造函数GeoInferenceActor.这样可以吗?有没有更好的方法呢?

    design-patterns scala anti-patterns actor akka

    26
    推荐指数
    2
    解决办法
    4643
    查看次数

    使用Git的常见反模式是什么?

    作为一个Git新手,我意识到我一直在使用它,好像它是Subversion.例如,总是在master上工作,而不是在拉动更改之前在本地提交.这通常会导致可避免的手动合并情况.使用Git的其他常见反模式有哪些?

    git version-control anti-patterns

    25
    推荐指数
    5
    解决办法
    2139
    查看次数

    用PHP扩展单例

    我在一个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"关键字.

    还有其他方法来实现我想要的东西吗?单例代码只有几行,但我仍然希望尽可能避免任何代码冗余.

    php inheritance singleton anti-patterns

    25
    推荐指数
    2
    解决办法
    1万
    查看次数