﻿<?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>Tue, 05 May 2009 11:24:30 GMT</pubDate><lastBuildDate>Tue, 05 May 2009 11:24:30 GMT</lastBuildDate><generator>cnblogs</generator><item><title>re: 初探数据表现层和业务逻辑层的分离</title><link>http://www.cppblog.com/Wealth/archive/2008/07/10/54977.html#55823</link><dc:creator>Wealth</dc:creator><author>Wealth</author><pubDate>Thu, 10 Jul 2008 09:59:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/07/10/54977.html#55823</guid><description><![CDATA[ 陈梓瀚(vczh)兄弟提供的思路真是妙极了。<br><br>对于是否需要分离UI和业务逻辑，确实是要看项目的进展，实施过程中还是有很多意想不到的麻烦。<img src ="http://www.cppblog.com/Wealth/aggbug/55823.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-07-10 17:59 <a href="http://www.cppblog.com/Wealth/archive/2008/07/10/54977.html#55823#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#55033</link><dc:creator>true</dc:creator><author>true</author><pubDate>Tue, 01 Jul 2008 04:58:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/07/01/54977.html#55033</guid><description><![CDATA[心里有个分离的倾向就行了，完全分离是不可能的，也是模糊的，难以理解又耽误项目进度的:D<img src ="http://www.cppblog.com/Wealth/aggbug/55033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">true</a> 2008-07-01 12:58 <a href="http://www.cppblog.com/Wealth/archive/2008/07/01/54977.html#55033#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#55027</link><dc:creator>企业即时通讯</dc:creator><author>企业即时通讯</author><pubDate>Tue, 01 Jul 2008 04:44:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/07/01/54977.html#55027</guid><description><![CDATA[有点高不可攀，我在学习。<img src ="http://www.cppblog.com/Wealth/aggbug/55027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">企业即时通讯</a> 2008-07-01 12:44 <a href="http://www.cppblog.com/Wealth/archive/2008/07/01/54977.html#55027#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#55021</link><dc:creator>紫云追雪</dc:creator><author>紫云追雪</author><pubDate>Tue, 01 Jul 2008 03:46:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/07/01/54977.html#55021</guid><description><![CDATA[      对于事件或消息处理部分看得不是很明白。<br>      楼上的，在不同处理音频文件播放上正解。使用“责任链模式”，可以使你的设计在业务逻辑中间层不必考虑不同文件格式（MP3,MIDI,WAV等）带来的影响。<br>      针对不同文件格式，提供与之对应的Handler（楼上的IPlayerCreator ），如果参照Com原理与Plugin思想，会使程序更灵活。<br>      开源的音频处理软件audacity（<a target="_new" href="http://audacity.sourceforge.net/">http://audacity.sourceforge.net/</a>），在不同音频格式的读取播放和插件方面写的不错，可以参考。<br>      audacity的GUI部分是使用开源库wxWidgets（<a target="_new" href="http://www.wxwidgets.org/">http://www.wxwidgets.org/</a>）写的。<img src ="http://www.cppblog.com/Wealth/aggbug/55021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">紫云追雪</a> 2008-07-01 11:46 <a href="http://www.cppblog.com/Wealth/archive/2008/07/01/54977.html#55021#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#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></channel></rss>