<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Behind the Code &#187; oop</title>
	<atom:link href="http://yinwm.com/category/oop/feed/" rel="self" type="application/rss+xml" />
	<link>http://yinwm.com</link>
	<description>Thinking in Techique</description>
	<lastBuildDate>Fri, 06 Aug 2010 02:38:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>一个JavaScript继承的实现</title>
		<link>http://yinwm.com/2006/06/%e4%b8%80%e4%b8%aajavascript%e7%bb%a7%e6%89%bf%e7%9a%84%e5%ae%9e%e7%8e%b0/</link>
		<comments>http://yinwm.com/2006/06/%e4%b8%80%e4%b8%aajavascript%e7%bb%a7%e6%89%bf%e7%9a%84%e5%ae%9e%e7%8e%b0/#comments</comments>
		<pubDate>Wed, 21 Jun 2006 04:49:04 +0000</pubDate>
		<dc:creator>yinwm</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[oop]]></category>

		<guid isPermaLink="false">http://yinwm.cn/wordpress/?p=12</guid>
		<description><![CDATA[如我前面的文章说的，对于JavaScript，一个类，就是一个function，他的类方法（也就是static的）都是作为这个function的一部分，而实例方法，都是在prototype上面的。 function ClassA() { } ClassA.staticMethod = function () { } ClassA.prototype.instanceMethod = function () { } 在我这个实现当中，一个类的继承是拷贝父类的所有类方法，这样子类就有了父类的静态方法。 然后让子类的prototype.prototype指向父类的prototype. 然后可以根据自己的需要，重写一些方法。 function ClassB() { } ClassB.staticMethod = ClassA.staticMethod; ClassB.prototype.prototype = ClassA.prototype; ClassB.prototype.instanceMethod = function () { // method 2 } 对于子类，使用一个prototype的链，来实现方法的实例方法的继承。之所以选择这种实现方法，是因为子类是要重写其中的某些方法的。而 prototype又是一个reference，所以直接的写作ClassB.prototype = ClassA.prototype，会在重写ClassB的实例方法的同时，破坏ClassA的实例方法。而修改后的方法则会屏蔽父类的。 寻找方法的顺序是，instanceA.prototype.method -&#62; ClassA.prototype. 此时对于类方法的继承，已经实现，现在需要实现在子类中，调用父类的方法。 对于Java，这样的使用是很平常的 public void method() { super.method(); } 在JavsScript中，为了实现此类功能，所以必须保留一个parent的reference，指向ParentClass.prototype. [...]]]></description>
			<content:encoded><![CDATA[<p>如我前面的文章说的，对于JavaScript，一个类，就是一个function，他的类方法（也就是static的）都是作为这个function的一部分，而实例方法，都是在prototype上面的。<br />
function ClassA() {<br />
}</p>
<p>ClassA.staticMethod = function () {<br />
}</p>
<p>ClassA.prototype.instanceMethod = function () {<br />
}</p>
<p>在我这个实现当中，一个类的继承是拷贝父类的所有类方法，这样子类就有了父类的静态方法。<br />
然后让子类的prototype.prototype指向父类的prototype.<br />
然后可以根据自己的需要，重写一些方法。<br />
function ClassB() {<br />
}<br />
ClassB.staticMethod = ClassA.staticMethod;<br />
ClassB.prototype.prototype = ClassA.prototype;<br />
ClassB.prototype.instanceMethod = function () {<br />
// method 2<br />
}</p>
<p>对于子类，使用一个prototype的链，来实现方法的实例方法的继承。之所以选择这种实现方法，是因为子类是要重写其中的某些方法的。而<br />
prototype又是一个reference，所以直接的写作ClassB.prototype =<br />
ClassA.prototype，会在重写ClassB的实例方法的同时，破坏ClassA的实例方法。而修改后的方法则会屏蔽父类的。</p>
<p>寻找方法的顺序是，instanceA.prototype.method -&gt; ClassA.prototype.<br />
此时对于类方法的继承，已经实现，现在需要实现在子类中，调用父类的方法。<br />
对于Java，这样的使用是很平常的<br />
public void method() {<br />
super.method();<br />
}<br />
在JavsScript中，为了实现此类功能，所以必须保留一个parent的reference，指向ParentClass.prototype.<br />
ClassB.prototype.parent = ClassA.prototype.<br />
那么在instanceB里面调用this.parent.method.call(this);就可以使用父类的方法了。使用call调用，是为了把自己的数据传到父类。更漂亮的解决方法，我还没有想到。</p>
<p>所以完成的代码是<br />
function ClassA() {<br />
}</p>
<p>ClassA.prototype.method1 = function () {<br />
}</p>
<p>ClassA.staticMethod = function () {<br />
}</p>
<p>function ClassB(){<br />
}</p>
<p>ClassB.staticMethod = ClassA.staticMethod;</p>
<p>ClassB.prototype.prototype = ClassB.prototype.parent = ClassA.prototype;</p>
<p>这个我抽象出来一个extend方法，</p>
<p>var LCore = function () {<br />
}</p>
<p>LCore.extend = function (destination, source) {<br />
// copy all functons<br />
for (var prop in source) {<br />
if (prop == “prototype”) {<br />
continue;<br />
}</p>
<p>destination.prototype[prop] = source[prop];<br />
}</p>
<p>// make a reference for parent and reference prototype<br />
destination.prototype.prototype = destination.prototype.parent = source.prototype;</p>
<p>return destination;<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://yinwm.com/2006/06/%e4%b8%80%e4%b8%aajavascript%e7%bb%a7%e6%89%bf%e7%9a%84%e5%ae%9e%e7%8e%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个资源申请，提供服务的系统的设计</title>
		<link>http://yinwm.com/2006/06/%e4%b8%80%e4%b8%aa%e8%b5%84%e6%ba%90%e7%94%b3%e8%af%b7%ef%bc%8c%e6%8f%90%e4%be%9b%e6%9c%8d%e5%8a%a1%e7%9a%84%e7%b3%bb%e7%bb%9f%e7%9a%84%e8%ae%be%e8%ae%a1/</link>
		<comments>http://yinwm.com/2006/06/%e4%b8%80%e4%b8%aa%e8%b5%84%e6%ba%90%e7%94%b3%e8%af%b7%ef%bc%8c%e6%8f%90%e4%be%9b%e6%9c%8d%e5%8a%a1%e7%9a%84%e7%b3%bb%e7%bb%9f%e7%9a%84%e8%ae%be%e8%ae%a1/#comments</comments>
		<pubDate>Tue, 20 Jun 2006 11:09:09 +0000</pubDate>
		<dc:creator>yinwm</dc:creator>
				<category><![CDATA[oop]]></category>

		<guid isPermaLink="false">http://yinwm.cn/wordpress/?p=11</guid>
		<description><![CDATA[今天在公司和同时讨论一些系统的设计问题，争的面红耳赤，最终也没有达成一直。这里写出来，大家一起讨论一下。 问题的提出： 在一个系统中，需要提供一系列的服务（假设这个服务是购买键盘，买电，租用电脑等假象的情况），这些服务以购买产品的形式出现。比如一个产品可以包含一些 服务（同时买2个键盘）。这里，有很多的备选资源，比如有无限多的键盘，还有唯一的比如IBM电脑一台，DELL电脑一台。这些资源都是购买，租用服务的 备选资源。 此时对于键盘等消耗品，使用坏了，就得买新的，对于唯一的IBM电脑，可以租用一定的时间。 问题就是，如何设计这个系统。 也许到这里，你看的还不是特明白，那么我直接说两个有分歧的设计方法吧。 对于所有的无限的资源（比如电能），这个很好说，加入张三买电100度，给你，并且产生一个用电的服务。这个服务一直处于等待状态，张三来了，就可以用这100度电，并且不断的减少。 对于电脑的租用，虽然都是租用，但是由于电脑不同（一个IBM的，一个DELL的），所以产生两个不同的租用服务，都是等待状态，用于处理不同的电脑。 这是一个基于服务的模型，一个系统有很多的（可能是无限多的）服务，每个服务都在等待，等使用的资源没有了，那么销毁这个服务。 这个是我反对的设计模型，因为我认为在某些服务（比如租用电脑），这个不管资源是什么，他都是一个相同的动作，完全是可以抽象出来的。而对于电脑，作为可申请的资源，对外销售。用户买的是资源，而不是买直接的服务。最后做事情是有对应的服务＋资源实现的。 一个服务是否可以运行，首先检查是否有可用的资源，然后检查一些其他的服务限制条件（比如暂时停止本服务等）。这个状态是在申请的时刻，根据服务的这个动 作和相关的数据（比如租用什么电脑，是否到租用期）计算出来的。为了提高效率，应该是在这个时候，应该单独的启用一个线程来处理这个请求。就好像 apache处理一个请求。 处理就是动作（复制到新线程的）＋数据，判断状态，得到结果。 对于资源的申请，可以仿照一些现有的系统。比如内存的申请。 对于服务的工作，可以仿照apache的系统。 可见，我的这个设计，主要是考虑到不同的类的职责的划分。还有就是尽量的遵循现有的系统的设计思想。虽然是在很多不同的领域，但是他的设计思想还是 很可以复用的。那么这个已经很成熟的设计，肯定会把可能遇到的问题，解决方案都有完备的记录。那么这样就能够节省很多时间。没必要重复的发明轮子。 我们还有一个有分歧的地方，就是，他们认为所有的server单独处理，是可以记录状态并且在出问题的时候，容易定位。 我的想法是，假设系统运转无误，在做所有动作的时候记录日志，并且记录数据。这个时候整个的系统，在没有日志组件的时候，也是可以运转的。并且这个对日志的记录也是参照现在操作系统，数据库系统设计的。 还是那句话，参照现有的成熟的设计思想。 不知道大家有什么想法和见解，请大家不吝赐教。]]></description>
			<content:encoded><![CDATA[<p>今天在公司和同时讨论一些系统的设计问题，争的面红耳赤，最终也没有达成一直。这里写出来，大家一起讨论一下。</p>
<p>问题的提出：<br />
在一个系统中，需要提供一系列的服务（假设这个服务是购买键盘，买电，租用电脑等假象的情况），这些服务以购买产品的形式出现。比如一个产品可以包含一些<br />
服务（同时买2个键盘）。这里，有很多的备选资源，比如有无限多的键盘，还有唯一的比如IBM电脑一台，DELL电脑一台。这些资源都是购买，租用服务的<br />
备选资源。<br />
此时对于键盘等消耗品，使用坏了，就得买新的，对于唯一的IBM电脑，可以租用一定的时间。<br />
问题就是，如何设计这个系统。</p>
<p>也许到这里，你看的还不是特明白，那么我直接说两个有分歧的设计方法吧。<br />
对于所有的无限的资源（比如电能），这个很好说，加入张三买电100度，给你，并且产生一个用电的服务。这个服务一直处于等待状态，张三来了，就可以用这100度电，并且不断的减少。<br />
对于电脑的租用，虽然都是租用，但是由于电脑不同（一个IBM的，一个DELL的），所以产生两个不同的租用服务，都是等待状态，用于处理不同的电脑。<br />
这是一个基于服务的模型，一个系统有很多的（可能是无限多的）服务，每个服务都在等待，等使用的资源没有了，那么销毁这个服务。</p>
<p>这个是我反对的设计模型，因为我认为在某些服务（比如租用电脑），这个不管资源是什么，他都是一个相同的动作，完全是可以抽象出来的。而对于电脑，作为可申请的资源，对外销售。用户买的是资源，而不是买直接的服务。最后做事情是有对应的服务＋资源实现的。<br />
一个服务是否可以运行，首先检查是否有可用的资源，然后检查一些其他的服务限制条件（比如暂时停止本服务等）。这个状态是在申请的时刻，根据服务的这个动<br />
作和相关的数据（比如租用什么电脑，是否到租用期）计算出来的。为了提高效率，应该是在这个时候，应该单独的启用一个线程来处理这个请求。就好像<br />
apache处理一个请求。<br />
处理就是动作（复制到新线程的）＋数据，判断状态，得到结果。</p>
<ol>
<li>对于资源的申请，可以仿照一些现有的系统。比如内存的申请。</li>
<li>对于服务的工作，可以仿照apache的系统。</li>
</ol>
<p>可见，我的这个设计，主要是考虑到不同的类的职责的划分。还有就是尽量的遵循现有的系统的设计思想。虽然是在很多不同的领域，但是他的设计思想还是<br />
很可以复用的。那么这个已经很成熟的设计，肯定会把可能遇到的问题，解决方案都有完备的记录。那么这样就能够节省很多时间。没必要重复的发明轮子。</p>
<p>我们还有一个有分歧的地方，就是，他们认为所有的server单独处理，是可以记录状态并且在出问题的时候，容易定位。<br />
我的想法是，假设系统运转无误，在做所有动作的时候记录日志，并且记录数据。这个时候整个的系统，在没有日志组件的时候，也是可以运转的。并且这个对日志的记录也是参照现在操作系统，数据库系统设计的。<br />
还是那句话，参照现有的成熟的设计思想。</p>
<p>不知道大家有什么想法和见解，请大家不吝赐教。</p>
]]></content:encoded>
			<wfw:commentRss>http://yinwm.com/2006/06/%e4%b8%80%e4%b8%aa%e8%b5%84%e6%ba%90%e7%94%b3%e8%af%b7%ef%bc%8c%e6%8f%90%e4%be%9b%e6%9c%8d%e5%8a%a1%e7%9a%84%e7%b3%bb%e7%bb%9f%e7%9a%84%e8%ae%be%e8%ae%a1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
