﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-无名工匠-最新评论</title><link>http://www.cppblog.com/Wealth/CommentsRSS.aspx</link><description /><language>zh-cn</language><pubDate>Mon, 30 Jun 2008 11:27:19 GMT</pubDate><lastBuildDate>Mon, 30 Jun 2008 11:27:19 GMT</lastBuildDate><generator>cnblogs</generator><item><title>re: 初探数据表现层和业务逻辑层的分离</title><link>http://www.cppblog.com/Wealth/archive/2008/07/01/54977.html#54996</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Mon, 30 Jun 2008 18:47:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/07/01/54977.html#54996</guid><description><![CDATA[看了我自己的评论之后突然想起了某文（Why I Hate Framework）中所提到的IFactoryFactoryFactory。你可以去看看。<img src ="http://www.cppblog.com/Wealth/aggbug/54996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">陈梓瀚(vczh)</a> 2008-07-01 02:47 <a href="http://www.cppblog.com/Wealth/archive/2008/07/01/54977.html#54996#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 初探数据表现层和业务逻辑层的分离</title><link>http://www.cppblog.com/Wealth/archive/2008/07/01/54977.html#54995</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Mon, 30 Jun 2008 18:38:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/07/01/54977.html#54995</guid><description><![CDATA[你的IMainCtrl看起来似乎是界面事件的接收器。CUIFactory创建界面，界面把事件传递到IMainCtrl，IMainCtrl再把时间传递到IPlayer，然后每一种IPlayer实现不同的音乐格式的播放。<br><br>不过CPlayerFactory和IPlayer那么设计似乎有点不妥，不知道是不是我对你的图的理解有偏差。我的意见是这样的：因为你的每一种IPlayer的实现是对应于一种文件格式的，但是文件格式需要将文件读进来之后才知道。这里有两种情况：1、你通过扩展名来判断；2、你通过文件的前几个字节来判断。我推荐第二种。<br><br>那么这个情况下，你需要的是一个映射，将文件的前若干个字节对应到一种IPlayer的实现上。那么你的CPlayerFactory就不应当那么设计。你的每一种IPlayer都要有一个规格相同的创建函数（普通函数）或者一个继承了IPlayerCreator的全局对象（可以是static），然后你将每一种创建函数或IPlayerCreator绑定到一个扩展名或文件的前若干个字节上面。然后CPlayerFactory通过检查文件名或读入文件的前几个字节来判断究竟要使用哪一种IPlayerCreator，最后才使用IPlayerCreator创建IPlayer。<br><br>那么这里我稍微做一下图：<br><br>class IPlayer<br>{<br>public:<br>  virtual void Load(string FileName);<br>  /*Play SetPosition Reset Pause等操作*/<br>  virtual IPlayerCreator* GetCreator();/*GetCreator返回的是一个全局对象，只要是相同的IPlayer就返回相同的IPlayerCreator。主要用于当prototype或者释放自己用*/<br>};<br><br>class IPlayerCreator<br>{<br>public:<br>  virtual IPlayer* CreatePlayer();<br>  virtual void DestroyPlayer(IPlayer* Player);<br>  /*Test函数通过阅读文件的内容（已经填入Buffer，可以不完全填入）来判断IPlayerCreator所创建的IPlayer是否能够播放这种文件*/<br>  virtual bool Test(void* Buffer);<br>};<br><br>class CPlayerFactory<br>{<br>public:<br>  /*注册一种PlayerCreator*/<br>  void Register(IPlayerCreator* Creator);<br>  /*通过文件来选择IPlayerCreator，这里使用责任链模式依次测试所有IPlayerCreator直到IPlayerCreator::Test返回true*/<br>  IPlayerCreator* SelectCreator(string FileName);<br>};<br><br>这是我的观点，这种做法可以解决你『不能通过文件来构造Player』的弱点。<img src ="http://www.cppblog.com/Wealth/aggbug/54995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">陈梓瀚(vczh)</a> 2008-07-01 02:38 <a href="http://www.cppblog.com/Wealth/archive/2008/07/01/54977.html#54995#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 初探数据表现层和业务逻辑层的分离</title><link>http://www.cppblog.com/Wealth/archive/2008/06/30/54977.html#54982</link><dc:creator>LOGOS</dc:creator><author>LOGOS</author><pubDate>Mon, 30 Jun 2008 13:08:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/06/30/54977.html#54982</guid><description><![CDATA[对你的想法表示肯定<br>呵呵<br><img src ="http://www.cppblog.com/Wealth/aggbug/54982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">LOGOS</a> 2008-06-30 21:08 <a href="http://www.cppblog.com/Wealth/archive/2008/06/30/54977.html#54982#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 从wave文件的读写看程序中struct的设计</title><link>http://www.cppblog.com/Wealth/archive/2008/06/24/53507.html#54468</link><dc:creator>Wealth</dc:creator><author>Wealth</author><pubDate>Tue, 24 Jun 2008 06:55:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/06/24/53507.html#54468</guid><description><![CDATA[@R2仔<br>在这个应用中是可以的。<br>但我们在这里讨论的不是几个字节对齐的问题，而是如何避免由于潜在的机制而导致的bug<img src ="http://www.cppblog.com/Wealth/aggbug/54468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">Wealth</a> 2008-06-24 14:55 <a href="http://www.cppblog.com/Wealth/archive/2008/06/24/53507.html#54468#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 从wave文件的读写看程序中struct的设计</title><link>http://www.cppblog.com/Wealth/archive/2008/06/23/53507.html#54319</link><dc:creator>R2仔</dc:creator><author>R2仔</author><pubDate>Sun, 22 Jun 2008 17:10:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/06/23/53507.html#54319</guid><description><![CDATA[用 #pragma pack(2) 来改变字节对齐设置也可以吧<img src ="http://www.cppblog.com/Wealth/aggbug/54319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">R2仔</a> 2008-06-23 01:10 <a href="http://www.cppblog.com/Wealth/archive/2008/06/23/53507.html#54319#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 从wave文件的读写看程序中struct的设计</title><link>http://www.cppblog.com/Wealth/archive/2008/06/17/53507.html#53752</link><dc:creator>Wealth</dc:creator><author>Wealth</author><pubDate>Tue, 17 Jun 2008 11:56:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/06/17/53507.html#53752</guid><description><![CDATA[@Kevin Lynx<br><br>对呀，这些bug一般还很难找。<img src ="http://www.cppblog.com/Wealth/aggbug/53752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">Wealth</a> 2008-06-17 19:56 <a href="http://www.cppblog.com/Wealth/archive/2008/06/17/53507.html#53752#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 从wave文件的读写看程序中struct的设计</title><link>http://www.cppblog.com/Wealth/archive/2008/06/16/53507.html#53513</link><dc:creator>Kevin Lynx</dc:creator><author>Kevin Lynx</author><pubDate>Mon, 16 Jun 2008 03:21:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/06/16/53507.html#53513</guid><description><![CDATA[有道理，对于用struct写文件这种情况，很容易因为struct的字节对齐问题导致想不到的BUG。尤其是采用直接将struct以二进制方式写入文件的方式写文件。<br><img src ="http://www.cppblog.com/Wealth/aggbug/53513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">Kevin Lynx</a> 2008-06-16 11:21 <a href="http://www.cppblog.com/Wealth/archive/2008/06/16/53507.html#53513#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>