1

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

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

  • 绿色 = 无压力
  • 白色 = 白色玩家拥有该牌
  • 黑色 = 黑色玩家拥有该牌
  • 从渐变绿色-黄色-橙色-红色中挑选的颜色:此图块的冲突情况

AI 在项目中,但目前我专注于让这款游戏在两种情况下都能在设备上正确玩:平板电脑上的桌面游戏或网络游戏。

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

当我尝试将所有内容放在一起时,我的问题就出现了:

(客户端库)-RequireJS--> 加载文件--KnockoutJS--> 绑定 UI 事件--ICanHaz--> 模板化--Zepto--> DOM 操作-也许还有用于实用程序的 underscoreJS

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

在旧程序 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;

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

  • 引用任何类型的对象(棋盘、棋子、瓷砖、影响...)
  • 对象之间的关系
  • 以及明显的一些类型检查和基数/数量求和

(我此时正在烤代码)

一些问题 :

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

注意:我尝试阅读游戏引擎代码(Crafty、Quintus...),但这些引擎的核心(1600 行代码)虽然有据可查,但很难理解(起点在哪里?运行时流程在哪里? ??)

  • UML:我觉得经典方法可能会因闭包、回调和嵌套范围而迅速失败,我似乎本能地编写和理解,但绘制拖动图似乎是一种技巧……优秀的 JS 开发人员使用什么作为安全绳爬上 1500+ 行代码高峰?

    • 最后一个:我将有一个“类似 jquery”的引擎 API,可以轻松地将其插入 GUI 的 KnockOut ViewModels 的计算 observables 中。像这样的东西

[代码]

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()

[/代码]

...但目前,我不知道如何建模、编写和测试这些可变对象。

欢迎提出建议。感谢帮助。

4

1 回答 1

0

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

紧密耦合的对象也是你在使用闭包时会遇到的问题,你可以使用中介模式来解决这个问题。Mediator 可以使您的代码复杂化,但您可以在设置后轻松控制应用程序流程。

在大型项目中,为您的 JS 项目提供好的工具很重要,我尝试了一些;比如带有 Eclipse 的 Google 闭包编译器,带有 typescript 的 Visual Studio,现在正在尝试带有 Dart 编辑器的 Dart (google Dart)(=带有正确插件的 Eclipse)。这可以帮助您快速发现不一致并更轻松地重构。Typescript 将是唯一一种易于使用 JS 库的工具,因为 Typescript 是带有可选扩展的 JS。不确定 AngularJS 是如何与 Dart 端口一起出现的,但这是值得关注的。

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

于 2013-11-15T14:07:54.523 回答