我正在尝试重构我的旧Colorchess(ChessHighlight)程序。这是一个棋盘,旨在增强西洋棋棋子在每个回合的影响,以帮助初学者理解游戏。
根据给定转弯处的船上压力平衡,瓷砖的颜色如下:
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;
现在我通过创建一个用于存储的“对象关系池管理器”来解决 - 部分 - 这个问题:
(我现在正在烘焙代码)
一些问题:
注意:我尝试阅读游戏引擎代码(Crafty,Quintus ......)但这些引擎的核心(1600行代码),虽然它们有很好的文档记录,很难理解(起点在哪里?是运行时流程??)
UML:我觉得经典方法可能会因闭包,回调和嵌套范围而迅速失败,我似乎本能地写作和理解,但绘制图表似乎是一个技巧......什么是好的JS开发人员使用安全绳索攀登1500多个代码行峰值?
[代码]
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()
[/代码]
...但是暂时,我不知道如何建模,编写和测试那些可变对象。
欢迎提出建议。谢谢你的帮助。
答案 0 :(得分:0)
我不认为在构造函数中定义对象是不好的。将它们定义为闭包更糟糕,因为它会消耗更多资源,并且不像JS引擎那样容易优化。
紧密耦合的对象也是闭包的问题,你可以使用mediator模式。介体可能会使您的代码复杂化,但您可以在设置后轻松控制应用程序流程。
为大型项目提供良好的JS项目工具非常重要,我尝试了一些;比如谷歌关闭编译器与Eclipse,Visual Studio与打字稿,现在尝试Dart(谷歌Dart)与Dart编辑器(= Eclipse与正确的插件)。这可以帮助您快速发现不一致,并且更容易重构。 Typescript将是唯一一个易于使用JS库的文件,因为Typescript是带有可选扩展的JS。不确定AngularJS是如何与Dart端口一起出现的,但值得一看。
对于ACID,如果您正在讨论以反映服务器数据库中数据的方式更新客户端对象的状态。您可以使用promise而不是回调。这将提高XHR更新的可读性。编写PHP,这样您就可以获得具有片段和片段所需状态的更新消息,以便它可以更改事务中的数据。