Submitted by gouki on 2008, April 30, 8:54 AM
三个月了,终于,PR有了1,实在让我很感慨呀。。。
以前的域名仍然是PR4,不知道这个PR值是怎么计算的。不过。。。还是很开心
Tags: pr
Misc | 评论:0
| 阅读:19693
Submitted by gouki on 2008, April 29, 11:25 PM
Misc | 评论:0
| 阅读:19404
Submitted by gouki on 2008, April 28, 8:25 AM
最近自己写的东西少了,思想的沉淀是需要一个过程的。目前思想还没有空沉淀,所以……转贴占了多数,不过。这并不妨碍我的学习热情,之所以转贴,那是代表我需要学习,或者需要收藏它,不是吗?
当然,如果遇到什么未知的情况,我还是会第一时间写下来的。好记性不如烂笔头。虽然现在不再用笔记录,但用计算机来记录点滴也是可以让自己多一份回忆的。
Tags: 侃, 转贴
Misc | 评论:0
| 阅读:19868
Submitted by gouki on 2008, April 27, 11:25 PM
单一职责原则SRP:Single Responsibility Principle
开放封闭原则OCP:Open-Close Principle
Liskov替换原则LSP:Liskov Substitution Principle
依赖倒置原则DIP:Dependency Invertion Principle
接口隔离原则ISP:Interface Separate Principle
在面向对象设计中,如何通过很小的设计改变就可以应对设计需求的变化,这是令设计者极为关注的问题。为此不少OO先驱提出了很多有关面向对象的设计原则用于指导OO的设计和开发。下面是几条与类设计相关的设计原则。
1. 开闭原则(the Open Closed Principle OCP)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。因此在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态技术。该原则同样适合于非面向对象设计的方法,是软件工程设计方法的重要原则之一。我们以收音机的例子为例,讲述面向对象的开闭原则。我们收听节目时需要打开收音机电源,对准电台频率和进行音量调节。但是对于不同的收音机,实现这三个步骤的细节往往有所不同。比如自动收缩电台的收音机和按钮式收缩在操作细节上并不相同。因此,我们不太可能针对每种不同类型的收音机通过一个收音机类来实现(通过重载)这些不同的操作方式。但是我们可以定义一个收音机接口,提供开机、关机、增加频率、降低频率、增加音量、降低音量六个抽象方法。不同的收音机继承并实现这六个抽象方法。这样新增收音机类型不会影响其它原有的收音机类型,收音机类型扩展极为方便。此外,已存在的收音机类型在修改其操作方法时也不会影响到其它类型的收音机。
2. 替换原则 (the Liskov Substitution Principle LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。这个原则是Liskov于1987年提出的设计原则。它同样可以从Bertrand Meyer 的DBC (Design by Contract) 的概念推出。
我们以学生为例,夜校生为学生的子类,因此在任何学生可以出现的地方,夜校生均可出现。这个例子有些牵强,一个能够反映这个原则的例子时圆和椭圆,圆是椭圆的一个特殊子类。因此任何出现椭圆的地方,圆均可以出现。但反过来就可能行不通。
运用替换原则时,我们尽量把类B设计为抽象类或者接口,让C类继承类B(接口B)并实现操作A和操作B,运行时,类C实例替换B,这样我们即可进行新类的扩展(继承类B或接口B),同时无须对类A进行修改。
3. 依赖原则 (the Dependency Inversion Principle DIP)
在进行业务设计时,与特定业务有关的依赖关系应该尽量依赖接口和抽象类,而不是依赖于具体类。具体类只负责相关业务的实现,修改具体类不影响与特定业务有关的依赖关系。
在结构化设计中,我们可以看到底层的模块是对高层抽象模块的实现(高层抽象模块通过调用底层模块),这说明,抽象的模块要依赖具体实现相关的模块,底层模块的具体实现发生变动时将会严重影响高层抽象的模块,显然这是结构化方法的一个"硬伤"。
面向对象方法的依赖关系刚好相反,具体实现类依赖于抽象类和接口。
为此,我们在进行业务设计时,应尽量在接口或抽象类中定义业务方法的原型,并通过具体的实现类(子类)来实现该业务方法,业务方法内容的修改将不会影响到运行时业务方法的调用。
4. 接口分离原则(the Interface Segregation Principle ISP)
采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。
ISP原则是另外一个支持诸如COM等组件化的使能技术。缺少ISP,组件、类的可用性和移植性将大打折扣。
这个原则的本质相当简单。如果你拥有一个针对多个客户的类,为每一个客户创建特定业务接口,然后使该客户类继承多个特定业务接口将比直接加载客户所需所有方法有效。
以上四个原则是面向对象中常常用到的原则。此外,除上述四原则外,还有一些常用的经验诸如类结构层次以三到四层为宜、类的职责明确化(一个类对应一个具体职责)等可供我们在进行面向对象设计参考。但就上面的几个原则看来,我们看到这些类在几何分布上呈现树型拓扑的关系,这是一种良好、开放式的线性关系、具有较低的设计复杂度。一般说来,在软件设计中我们应当尽量避免出现带有闭包、循环的设计关系,它们反映的是较大的耦合度和设计复杂化。
Tags: 面向对象, 原则
Misc | 评论:0
| 阅读:20691
Submitted by gouki on 2008, April 27, 11:15 PM
COPY自一个网站,该网站声明此文章来自CSDN,代码没有仔细研读,但担心以后可能会用到。先MARK一下,做个记录。所以……
直接为我的博客加点料,原作者看到此文时,如觉不适,请通知删除。谢谢
JavaScript代码
- <script>
- function Point2D(x, y)
- {
- this.x = x;
- this.y = y;
- Point2D.prototype.quadrant = function()
- {
- if (x > 0 && y > 0) return "I";
- else if (x < 0 && y > 0) return "II";
- else if (x < 0 && y < 0) return "III";
- else if (x > 0 && y < 0) return "IV";
- else if (x == 0) return "x-axis";
- else if (y == 0) return "y-axis";
- else throw new Error();
- }
- Point2D.prototype.toVector = function()
- {
- return new Vector2D(x, y);
- }
- Point2D.prototype.distance = function()
- {
- if (arguments.length == 1 && arguments[0] instanceof Point2D)
- {
- return this._point_distance.apply(this, arguments);
- }
- else if (arguments.length == 1 && arguments[0] instanceof Vector2D)
- {
- return this._vector_distance.apply(this, arguments);
- }
- else
- {
- throw new Error("Argument Error!");
- }
- }
- Point2D.prototype._point_distance = function(p)
- {
- return (new Vector2D(p,this)).length();
- }
- Point2D.prototype._vector_distance = function(v)
- {
- var v1 = new Vector2D(this, v.start);
- var v2 = new Vector2D(this, v.end);
-
- var area = Math.abs(v1.cross(v2));
-
- return area / v.length();
- }
- }
- function Vector2D()
- {
- if (arguments.length == 2 && arguments[0] instanceof Point2D && arguments[1] instanceof Point2D)
- {
- _point_point_Vector2D.apply(this, arguments);
- }
- else if (arguments.length == 2 && !isNaN(arguments[0]) && !isNaN(arguments[1]))
- {
- _double_double_Vector2D.apply(this, arguments);
- }
- else if (arguments.length == 4 && !isNaN(arguments[0]) && !isNaN(arguments[1])
- && !isNaN(arguments[2]) && !isNaN(arguments[3]))
- {
- _double_double_double_double_Vector2D.apply(this, arguments);
- }
- else
- {
- throw new Error("Argument Error!");
- }
- }
- function _point_point_Vector2D(p1, p2)
- {
- this.start = p1;
- this.end = p2;
- Vector2D.prototype.length = function()
- {
- return Math.sqrt(this.pond_x() * this.pond_x() + this.pond_y() * this.pond_y());
- }
- Vector2D.prototype.pond_x = function()
- {
- return this.start.x - this.end.x;
- }
- Vector2D.prototype.pond_y = function()
- {
- return this.start.y - this.end.y;
- }
- Vector2D.prototype.cross = function(v)
- {
- return this.pond_x() * v.pond_y() - v.pond_x() * this.pond_y();
- }
- }
- function _double_double_Vector2D(x,y)
- {
- this.pointPairs = new Array();
- this.pointPairs[0] = new Point2D(0, 0);
- this.pointPairs[1] = new Point2D(x, y);
-
- _point_point_Vector2D.apply(this, this.pointPairs);
- }
- function _double_double_double_double_Vector2D(x1, y1, x2, y2)
- {
- this.pointPairs = new Array();
- this.pointPairs[0] = new Point2D(x1, y1);
- this.pointPairs[1] = new Point2D(x2, y2);
-
- _point_point_Vector2D.apply(this, this.pointPairs);
- }
- var p1 = new Point2D(0,0);
- var p2 = new Point2D(10,10);
- var v1 = new Vector2D(p1,p2);
- alert("向量v1长度:"+v1.length());
- var v2 = new Vector2D(0,0,5,5);
- alert("向量v2长度:"+v2.length());
- var v3 = new Vector2D(0,10);
- alert("向量v3长度:"+v3.length());
- alert("向量v1与v2的交积:"+v1.cross(v2));
-
- var p3 = new Point2D(10,0);
- alert("点p1与p3的距离:"+p1.distance(p3));
- alert("点p3与向量v1的距离:"+p3.distance(v1));
- </script>
Tags: js, 重载
Javascript | 评论:0
| 阅读:24331