数独求解——面向对象解决算法问题(二)
2010-10-22 09:12
555 查看
昨天发了一篇:《数独求解——面向对象解决算法问题》,估计有很多人想拍砖了吧,呵呵,我先顶住,接着上上第二篇,在此篇中,主要回答以下几个问题:
1.这样面向对象的写法有什么好处?有什么缺点呢?
有很多人都说这题不应该用面向对象的做法做。因为首先,我的算法中借助了过多的语言特性,如泛型,如栈和队列,如类。而这些东西对解决此题提供了极大的帮助,不利于提升自己的算法能力,也违背了出题人的初衷。OK,我致歉。但我必须反驳:
因为你可以发现,此题如果用面向结构的方式做,我相信不出三百行代码,一定可以求解。虽然不能说代码多就表示难写,但我只想证明,我不是为了偷懒而故意回避面向过程。面向对象解算法问题往往需要花更多的代价。
那么为何你还用面向对象呢?因为我最近一直在看《大话设计模式》,感觉想借助之试一下自己的抽象能力。
既然面向对象添加了工作量,并且并没有减轻工作难度,那它带来了什么好处呢?
代码的可读性。我必须忏悔,我的代码不具备此特性。
代码的可移植性。你可以方便的将此代码移植到webform、silverlight上,已经抽象出来的三个类,不需要进行任何修改。
扩展性。你可以非常方便地改变棋盘的维数、初始化样式。同时,这里抽象出来的三个类,还容易实现其他的操作,比如,你想找出这个问题的所有解,只需要改前台的递归算法就可以了,其他的不用改。如果你想增加一些功能。
2.这个系统中存在的巨多问题,不知道你发现没?
首先,没有很好地做到遵循面向对象的开闭原则(对扩展开发,对修改封闭),因为我对修改也开发了,前台可以随便地修改这三类中本不该公开的属性,如version属性,这个不应该让前台用户进行修改,再如ChooseValues这个数组,前台应该只有读取的功能。再如Grid的GridRow属性,为了对外不公开,我将它设计为internal set,但更好的做法应该是设计为只读,通过构造函数或其他方式为其赋值。
另外系统中提供了过多的操作,而这些操作是我们不必要的,如:Grid类继承自IComparable实现了CompareTo(object obj)方法,但这个方法我一直没有用到。其他的这样的还挺多。
上面讲的是过渡封装,但系统中还存在封装不够的问题。如:返回一个单元格可选的数字,这个方法应该放到GridRowCollection中。
其他问题。。。。。。。。
3.这个题中,我用的是栈来缓存可能要回溯的Grid对象,实际上也可以考虑用队列来做,不过经过我思考和测试,此题更适合用栈。
4.这是一个算法题,就要求有较高的算法精度和较低的时间复杂度,很显然,这方面没有过好,过多的循环,必然会损失过多的性能。编程上的偷懒,带来了程序的稀乱。
这个题的算法绝不是维一的,希望大家也发表一下自己的意见,另外,我不介意有人再次拍砖,放到首页,就是希望有人来拍砖。请不必吝啬,希望得到大家的建议。
1.这样面向对象的写法有什么好处?有什么缺点呢?
有很多人都说这题不应该用面向对象的做法做。因为首先,我的算法中借助了过多的语言特性,如泛型,如栈和队列,如类。而这些东西对解决此题提供了极大的帮助,不利于提升自己的算法能力,也违背了出题人的初衷。OK,我致歉。但我必须反驳:
因为你可以发现,此题如果用面向结构的方式做,我相信不出三百行代码,一定可以求解。虽然不能说代码多就表示难写,但我只想证明,我不是为了偷懒而故意回避面向过程。面向对象解算法问题往往需要花更多的代价。
那么为何你还用面向对象呢?因为我最近一直在看《大话设计模式》,感觉想借助之试一下自己的抽象能力。
既然面向对象添加了工作量,并且并没有减轻工作难度,那它带来了什么好处呢?
代码的可读性。我必须忏悔,我的代码不具备此特性。
代码的可移植性。你可以方便的将此代码移植到webform、silverlight上,已经抽象出来的三个类,不需要进行任何修改。
扩展性。你可以非常方便地改变棋盘的维数、初始化样式。同时,这里抽象出来的三个类,还容易实现其他的操作,比如,你想找出这个问题的所有解,只需要改前台的递归算法就可以了,其他的不用改。如果你想增加一些功能。
2.这个系统中存在的巨多问题,不知道你发现没?
首先,没有很好地做到遵循面向对象的开闭原则(对扩展开发,对修改封闭),因为我对修改也开发了,前台可以随便地修改这三类中本不该公开的属性,如version属性,这个不应该让前台用户进行修改,再如ChooseValues这个数组,前台应该只有读取的功能。再如Grid的GridRow属性,为了对外不公开,我将它设计为internal set,但更好的做法应该是设计为只读,通过构造函数或其他方式为其赋值。
另外系统中提供了过多的操作,而这些操作是我们不必要的,如:Grid类继承自IComparable实现了CompareTo(object obj)方法,但这个方法我一直没有用到。其他的这样的还挺多。
上面讲的是过渡封装,但系统中还存在封装不够的问题。如:返回一个单元格可选的数字,这个方法应该放到GridRowCollection中。
其他问题。。。。。。。。
3.这个题中,我用的是栈来缓存可能要回溯的Grid对象,实际上也可以考虑用队列来做,不过经过我思考和测试,此题更适合用栈。
4.这是一个算法题,就要求有较高的算法精度和较低的时间复杂度,很显然,这方面没有过好,过多的循环,必然会损失过多的性能。编程上的偷懒,带来了程序的稀乱。
这个题的算法绝不是维一的,希望大家也发表一下自己的意见,另外,我不介意有人再次拍砖,放到首页,就是希望有人来拍砖。请不必吝啬,希望得到大家的建议。
相关文章推荐
- 数独求解——面向对象解决算法问题(一)
- Java面向对象思想解决猜拳问题
- 我的第一篇博客,java面向对象来解决简单的问题--杭电2001
- 面向对象方式解决比赛名单类问题(Java实现)
- 用求解图内节点是否可达的算法来解决IFDS问题
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为(转)
- 面向对象思想解决农场养牛问题
- 面向对象继承解决什么问题
- 面向对象思想解决的问题以及面向对象的三个特征
- 遇到一个面向对象无法解决的问题。
- 面向对象解决蚂蚁过杆问题
- 面向对象解决球的反弹问题
- php 面向对象之解决单继承问题
- Java面向对象方式(观察者模式)解决菲波拉契数列问题(兔子三岁后就可以生小兔子)
- 用C求解一元二次方程的解,遇到的问题及解决办法
- 解决PowerDesigner 16 Generate Datebase For Sql2005/2008 对象名sysproperties无效的问题
- PHP使用栈解决约瑟夫环问题算法示例
- 【我的Java笔记】多线程_使用Lock锁对象解决线程安全问题
- hibernate+spring mvc, 解决hibernate 对象懒加载 json序列化问题
- Java面向对象问题汇总