<?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>cashplk的心路历程 &#187; 单片机</title>
	<atom:link href="http://cashplk.com/tag/%e5%8d%95%e7%89%87%e6%9c%ba/feed/" rel="self" type="application/rss+xml" />
	<link>http://cashplk.com</link>
	<description>学无止境，梦如夏花～</description>
	<lastBuildDate>Sat, 31 Jul 2010 10:15:57 +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>单片机的代码如何在C一级结构化呢？ &#8212; 发散</title>
		<link>http://cashplk.com/2009/11/30/%e5%8d%95%e7%89%87%e6%9c%ba%e7%9a%84%e4%bb%a3%e7%a0%81%e5%a6%82%e4%bd%95%e5%9c%a8c%e4%b8%80%e7%ba%a7%e7%bb%93%e6%9e%84%e5%8c%96%e5%91%a2%ef%bc%9f-%e5%8f%91%e6%95%a3/</link>
		<comments>http://cashplk.com/2009/11/30/%e5%8d%95%e7%89%87%e6%9c%ba%e7%9a%84%e4%bb%a3%e7%a0%81%e5%a6%82%e4%bd%95%e5%9c%a8c%e4%b8%80%e7%ba%a7%e7%bb%93%e6%9e%84%e5%8c%96%e5%91%a2%ef%bc%9f-%e5%8f%91%e6%95%a3/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 14:15:29 +0000</pubDate>
		<dc:creator>cashplk</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[单片机]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[state模式]]></category>

		<guid isPermaLink="false">http://cashplk.com/2009/11/30/%e5%8d%95%e7%89%87%e6%9c%ba%e7%9a%84%e4%bb%a3%e7%a0%81%e5%a6%82%e4%bd%95%e5%9c%a8c%e4%b8%80%e7%ba%a7%e7%bb%93%e6%9e%84%e5%8c%96%e5%91%a2%ef%bc%9f-%e5%8f%91%e6%95%a3/</guid>
		<description><![CDATA[state模式处理多态的能力要比虚函数继承强很多也灵活很多。事实上，基于继承的虚函数实现多态，才是处理简单的interface的方法，更复杂的情况往往都是通过state模式来实现的。 &#160; 另外我补充一点，c++的多重继承毫无疑问是重型灾害，在任何情况下都不应该使用；但我说的是单继承——单继承也不是一个优先考虑的解决方案，类聚合在大部分情况下都优先于类继承。 &#160; 我还要说一点，继承虚函数仅仅是实现多态的一种方式，而且远远不是最好的方式。从灵活性，对应改变的能力，对复杂多态的实现能力上来说，state模式都胜过虚函数很多。 &#160; 回到老U的情况（很久没写c代码了，我写点伪码吧），你可以定义一个CSPI结构 struct CSPI{ &#160;&#160;&#160; void 通用函数1(){&#8230;&#8230;}; &#160;&#160;&#160; void 通用函数2(){&#8230;&#8230;}; &#160;&#160;&#160; &#8230;. &#160;&#160;&#160; struct *具体硬件 = null； &#160;&#160;&#160; void set(string 硬件名){ &#160;&#160;&#160;&#160;&#160;&#160;&#160; *具体硬件 = product(硬件名); //此处product函数返回对应于硬件名的子struct对象 &#160;&#160;&#160; } &#160;&#160;&#160; void SPIRead (){ &#160;&#160;&#160;&#160;&#160;&#160;&#160; if(具体硬件 == null) 抛出异常； &#160;&#160;&#160;&#160;&#160;&#160;&#160; 具体硬件-&#62;SPIRead (); &#160;&#160;&#160; } &#160;&#160;&#160; void SPIPowerDown(){ &#160;&#160;&#160;&#160;&#160;&#160;&#160; if(具体硬件 == null) 抛出异常； [...]]]></description>
			<content:encoded><![CDATA[<p>state模式处理多态的能力要比虚函数继承强很多也灵活很多。事实上，基于继承的虚函数实现多态，才是处理简单的interface的方法，更复杂的情况往往都是通过state模式来实现的。</p>
<p><b></b></p>
<p>&#160; 另外我补充一点，c++的多重继承毫无疑问是重型灾害，在任何情况下都不应该使用；但我说的是单继承——单继承也不是一个优先考虑的解决方案，类聚合在大部分情况下都优先于类继承。</p>
<p>&#160; 我还要说一点，继承虚函数仅仅是实现多态的一种方式，而且远远不是最好的方式。从灵活性，对应改变的能力，对复杂多态的实现能力上来说，state模式都胜过虚函数很多。</p>
<p>&#160; 回到老U的情况（很久没写c代码了，我写点伪码吧），你可以定义一个CSPI结构</p>
<p>struct CSPI{</p>
<p>&#160;&#160;&#160; void 通用函数1(){&#8230;&#8230;};</p>
<p>&#160;&#160;&#160; void 通用函数2(){&#8230;&#8230;};</p>
<p>&#160;&#160;&#160; &#8230;.</p>
<p>&#160;&#160;&#160; struct *具体硬件 = null；</p>
<p>&#160;&#160;&#160; void set(string 硬件名){</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; *具体硬件 = product(硬件名); //此处product函数返回对应于硬件名的子struct对象</p>
<p>&#160;&#160;&#160; }</p>
<p>&#160;&#160;&#160; void SPIRead (){</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(具体硬件 == null) 抛出异常；</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 具体硬件-&gt;SPIRead ();</p>
<p>&#160;&#160;&#160; }</p>
<p>&#160;&#160;&#160; void SPIPowerDown(){</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(具体硬件 == null) 抛出异常；</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 具体硬件-&gt;SPIPowerDown();</p>
<p>&#160;&#160;&#160; }</p>
<p>}</p>
<p>这样当你需要添加更多的子硬件类型的时候，CSPI结构不需要做任何修改，你需要做的就是写一个子硬件类型的struct，然后更新一下product方法(简单工厂)。</p>
</p>
<p>这个方法应该说是我最需要的static binding，而且它比macro控制好的地方是编译器仍然可以做类型检查；比interface好的地方是没有动态绑定，也不会有ripple effect。缺点是coding量比较大，因为每一个被调用的都需要全部实现所有的函数形式，但是考虑到它仍然有类型检查，以及单片机可怜的效率，这么做是值得的。</p>
<p>PS: 设计模式该看看了。</p>
]]></content:encoded>
			<wfw:commentRss>http://cashplk.com/2009/11/30/%e5%8d%95%e7%89%87%e6%9c%ba%e7%9a%84%e4%bb%a3%e7%a0%81%e5%a6%82%e4%bd%95%e5%9c%a8c%e4%b8%80%e7%ba%a7%e7%bb%93%e6%9e%84%e5%8c%96%e5%91%a2%ef%bc%9f-%e5%8f%91%e6%95%a3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->