关于javascript软件分解结构指南

时间:2013-11-15 06:41:17

标签: javascript closures prototype scoping modular

我正在尝试重构我的旧Colorchess(ChessHighlight)程序。这是一个棋盘,旨在增强西洋棋棋子在每个回合的影响,以帮助初学者理解游戏。

根据给定转弯处的船上压力平衡,瓷砖的颜色如下:

  • 绿色=没有压力
  • white = white player拥有磁贴
  • 黑色=黑色玩家拥有瓷砖
  • 从渐变绿黄橙红色中挑选的颜色:此拼贴的冲突情况

AI正处于项目中,但目前我专注于让这款游戏在各种情况下都能正常运行:平板电脑上的桌面游戏 - 或网络游戏。

我决定用javascript编写客户端代码,我喜欢它!和服务器同步将在PHP中,因为我的实际托管环境是在。

我的问题,虽然我试图将所有问题放在一起:

(客户端库)    - RequireJS - >加载文件    - KnockoutJS - >绑定UI事件    - ICanHaz - >模板    - Zepto - > DOM操纵    - 也许可以强调公用事业的jS

我担心制作意大利面条代码,难以理解和维护。

在旧程序ChessHighlight中,有很多隔行扫描的构造声明和原型扩展,例如:

// file board.js
function Board() { ... }
function Tile() { ... }

// next included file :
function Chessman() { ... }

// again in a third included file
// since board and chessmen are defined 
Tile.prototype.put(chessman) { ... }
Tile.prototype.empty() { ... }
由于游戏性质高度耦合,堆栈中的每个文件都包含越来越多的定义,而且代码变得凌乱......

一个难点是游戏需要事务性实现,因为我做了以下设置:

// both... (think ACID commit in a RDBMS)
tile_h8.chessman = rook_white_1;
rook_white_1.tile = tile_h8;

现在我通过创建一个用于存储的“对象关系池管理器”来解决 - 部分 - 这个问题:

  • 引用任何类型的对象(Board,Chessman,Tile,Influence ...)
  • 对象之间的关系
  • 和一些类型检查和基数/ arity求和

(我现在正在烘焙代码)

一些问题:

  • 如何以一种定义基本代码原子的方式编写可扩展代码(优雅地,没有类和接口模拟,而不是原型和闭包):Tile,Board,Chessman在非常短的文件中,然后将它们粘合在一起其他部分:添加行为回调?

注意:我尝试阅读游戏引擎代码(Crafty,Quintus ......)但这些引擎的核心(1600行代码),虽然它们有很好的文档记录,很难理解(起点在哪里?是运行时流程??)

  • UML:我觉得经典方法可能会因闭包,回调和嵌套范围而迅速失败,我似乎本能地写作和理解,但绘制图表似乎是一个技巧......什么是好的JS开发人员使用安全绳索攀登1500多个代码行峰值?

    • 和最后一个:我会有一个引擎API“jquery-like”,可以很容易地将它插入GUI的KnockOut ViewModels计算的observable中。像这样的东西

[代码]

var colorchess = new Colorchess( my_VM_for_this_DIV_part );
colorchess.reset( "standard-game" );
colorchess("a1") --> a wrapper for "a1" tile
colorchess("h8").chessman() --> a wrapper for "h8" tile's chessman (rook)

// iterate on black chessman
colorchess("black").each( function( ref, chessman) {})

// a chainable example
colorchess("white").chessman("queen").influences()

[/代码]

...但是暂时,我不知道如何建模,编写和测试那些可变对象。

欢迎提出建议。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我不认为在构造函数中定义对象是不好的。将它们定义为闭包更糟糕,因为它会消耗更多资源,并且不像JS引擎那样容易优化。

紧密耦合的对象也是闭包的问题,​​你可以使用mediator模式。介体可能会使您的代码复杂化,但您可以在设置后轻松控制应用程序流程。

为大型项目提供良好的JS项目工具非常重要,我尝试了一些;比如谷歌关闭编译器与Eclipse,Visual Studio与打字稿,现在尝试Dart(谷歌Dart)与Dart编辑器(= Eclipse与正确的插件)。这可以帮助您快速发现不一致,并且更容易重构。 Typescript将是唯一一个易于使用JS库的文件,因为Typescript是带有可选扩展的JS。不确定AngularJS是如何与Dart端口一起出现的,但值得一看。

对于ACID,如果您正在讨论以反映服务器数据库中数据的方式更新客户端对象的状态。您可以使用promise而不是回调。这将提高XHR更新的可读性。编写PHP,这样您就可以获得具有片段和片段所需状态的更新消息,以便它可以更改事务中的数据。