【问题标题】:Using just one design pattern in application在应用程序中仅使用一种设计模式
【发布时间】:2015-10-10 21:23:41
【问题描述】:

我正在尝试学习如何使我的应用程序在所有文件中具有相同的“面孔”,相同的模式,但我不知道这样做是否正确。

我想知道在软件开发中更正确的做法是将应用程序限制为仅一种模式。

例如,这就是我的应用程序的样子(只是一部分)

Api.js:

'use strict'
var Server = require('./server');
var Api = {
 init: function() {
   Server.init('start');
 }
};

Server.js:

'use strict'
var Server = {
 init: function(command) {
  this.command = command;

  if (command === 'start') {
    this.start();
  }
 }
};

我在所有应用程序中都使用“初始化对象模式”。所以我要避免装饰器模式、外观,以及一切。

我应该避免使用还是可以使用多个?如果正确的答案是使用几个,根据需要,我还有其他问题。这不会使维护变得更加困难吗?是不是让代码像意大利面一样?

谢谢。


更新。

我将再次尝试解释,这次是赏金。

我已经试着问了,但似乎没有人能给我一个简洁的答案。

我想知道制作一个好的应用程序,一个好的网络应用程序,谈论代码外观的秘诀是什么。我想知道我是否应该在整个洞应用程序中保持相同的标准代码,这是好的还是真的没关系。

例如,我有两个 EXAMPLES 文件

app.js:

var server = require('./server');

var app = {
 init: function() {
   server.init('DEVELOPMENT');
 }
};

module.exports = app;

server.js:

var server = {
 init: function(env) {
  if (env === 'DEVELOPMENT') {
    // CODE
  } else {
    // CODE
  }
 }
}

module.exports = server;

在这种情况下,我使用一个带有方法 init 的对象,这是我在洞应用程序中使用的模式..

或者没关系,我应该写什么:

第一个对象:

var server = require('./server');

var app = {
 init: function() {
   server('DEVELOPMENT');
 }
};

module.exports = app;

比服务器作为一个函数:

var server =function(env) {
  if (env === 'DEVELOPMENT') {
    // CODE
  } else {
    // CODE
  }
}

module.exports = server;

我可以给 100 分。令人难以置信的是,我无法为这个特定问题找到一个好的答案。

谢谢。

【问题讨论】:

  • 您使用模式来解决软件开发中的特定问题。如果您只有一个问题,那么您只需要一种模式。
  • 我正在尝试遵循您的意图。我猜只有一个 Server 模块和许多像 Api 这样的模块。这是真的吗?
  • 我的意图是在所有应用程序中仅使用对象初始化模式@RobertMoskal
  • 您所说的设计模式通常仅适用于静态类型(通常是单继承)基于类的 OOP 语言,如 C++ 和 Java。 JavaScript 不是这些。我并不是说它们都不适用,但你的方法似乎很教条。
  • 使用尽可能多的模式。保持简单。

标签: javascript design-patterns


【解决方案1】:

我应该使用其他模式吗?

不,你不应该坚持单一的模式。

不,designpatternbooks 不会建议您使用单一模式。 就像您无法以一种方式切碎所有成分(您要意大利面条吗?),您无法将所有逻辑组织在一种模式中。

当然,你可以让你的对象all使用初始化模式,而根本不使用构造函数。 还行吧。去过也做过。我喜欢。

但是这些对象可以与BuilderAbstract Factory 一起使用(如果它使事情simpler)。 只要建造者/工厂本身有初始化器,并且他们正确地初始化创建的对象,那么您对初始化器模式的使用将是一致的。 在creational 模式之外, 用structuralbehavioural 模式组织对象通常很好。 它们根本不与初始化程序冲突。

例如,查看DOM。 所有节点都是由Document 对象创建的——elementstext nodescomments,甚至是events。 这是Factory 模式。

然而 Document 对象也是一个Facade! 从它你可以访问整个系统的statusobjectsdata,你甚至可以write to it! 每一个 DOM 操作都是从 Document 开始的,它是 DOM 系统的 Facade。

DOM 节点也实现了多种模式。 它们组织在Compositelet you 中使用ObserverCommand 监听事件,并在Chain of Responsibility 中处理事件。 它们肯定会被 Interpreter 解析,DocumentFragmentProxy,svg 元素是 implemented 作为 DecoratorscreateNodeIterator 显然会给你一个 Iterator

关键是,良好的面向对象设计将产生多种设计模式作为结果,无论是否有意。


良好代码外观的秘诀是什么

我认为最好看的代码是对你来说最容易理解的代码, 以及随着您获得更多经验而阅读代码changes 的方式。

例如my style 对于大多数程序员来说过于简洁,但对我来说它取得了很好的平衡。 所以一定要发展自己的风格——你不是我,你也不是昨天的你。

在我们通过styles 时记住这一点。

在最低级别,我们有 coding style - 最重要的是缩进和括号。

这个很简单,选一个你喜欢的,坚持下去。 有languagespecificstyles,它们通常是很好的起点。 配置你的 IDE 的 formatter 以便你可以使用热键格式化你的所有代码。

在代码语法之上,我们有 comment stylenaming convention

在评论上设置rules 很好,有时它是necessary 用于记录工具。 在实践中避免toomuchcomment。 您可能还想决定您的namespace 以及您对naming 函数表达式的立场。

在这些结构之上,我们有逻辑约定

相同的代码逻辑通常可以通过多种方式完成,其中一些方式比其他方式更“漂亮”在您的眼中。 看看这个example

我第一眼就选择了第二种风格:没有duplicate,逻辑被清晰地划分,格式不是我的风格但合理。 但许多程序员更喜欢第一种风格:逻辑很简单,few duplications 值得。 虽然抽象,但这个级别是 quite deep - 以错误的方式呈现您的逻辑实际上 increase the chance 一个有经验的程序员读错了。

最后,我们到达了设计模式的层次,就代码美感而言。

保持代码结构美观的关键是在正确的级别上使用正确的模式以始终如一地完成loose couplingcode reuse, 同时避免pitfallsover-design

Therearequitesomebooksabout漂亮的代码, andthenthereareevenmorebooksabout设计和实现漂亮的软件。 (你自己决定哪些超出你的水平。) 知识与经验一样重要,只有花时间学习、编写和修改/重构您的应用程序,您才能获得这些知识。

在您探索和试验您的代码时,请随时改变主意。 改变主意是学习的好兆头。

但首先,familiarise yourself 带有设计模式。 只是不要忘记,它们是将object-oriented principals 应用于常见任务的通用结果。 设计仍由您自己决定。

设计模式AreNotSilverBullets

【讨论】:

  • @AmandaFerrari 很高兴你喜欢它!祝我掌握编程风格。 :)
【解决方案2】:

我认为这个问题的性质会让你有很多开放式的答案。最终,您需要选择现有范式的最佳方面,并全部或部分使用其方法。在我看来,您的许多 API 结构(以及因此的设计模式)将归结为您预期人们如何访问您的应用程序的端点。您提出的具有构造函数对象的方法是一种常见且非常灵活的方法;它允许为不可避免的代码重写和易于观察的应用程序的关键和范围进行原型设计。如果您已准备好支持 EMCA6,请将其切换到基于 Class 的构造函数,您会发现自己拥有一个非常易于管理的代码库,可以增长、面向对象并且具有非常准确的函数范围。

通常,我已经开发了遵循这种初始化风格的应用程序(试图使其尽可能地可读):

var Application = {
    initialise: function (config) {
        config = config || {} // defaults;
        ....
        this.contactServer(config.serverConfiguration);

    },
    contactServer: function (configServer) {
        ....
    },
    renderServerPayload: function (payLoad) {}
};

Application.manageServerResponse = function (serverResponse) {
    this.renderServerPayload(serverResponse);
};

祝您申请顺利。希望这有点用处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多