維's profileIT : 是工作還是嗜好?PhotosBlogListsMore Tools Help

Blog


    August 17

    您也是打痛苦混戰的高手嗎?

    我喜歡下圍棋,雖然我沒有太多的時間精進我的棋藝。在以前看棋譜或是看一些圍棋的故事時經常會看到一些敘述文字說某些圍棋高手是打混戰的高手,這是說圍棋局面愈亂擁有這種特質的圍棋高手就愈容易勝出。NBA也是一樣,每年我都和一些好友玩Fantasy NBA,也喜歡看NBA球賽,一些NBA好手也是打混戰的高手,這也是局勢愈混亂,比數愈接近的時候這些NBA球員就表現的愈好。

    但是很不幸的,在撰寫軟體方面如果我們說某人是打混戰的高手,那麼我就不知道這是恭維或是暗諷。什麼是寫軟體的打混戰的高手? 想想您寫過多少似曾相識的程式碼? 許多寫軟體的打混戰的高手在寫程式碼時非常的快速,腦筋更是運轉的快得不得了,因此當他們需要一些程式碼時,往往不願意花時間想想或是找找是不是已經有了可供使用的程式碼,就很快的再寫了一次,因為他們覺得再寫一次更快。或是當他們在寫COM+.NETJava時,許多中介的程式碼都大同貝異,只是因為程式語言的不同或是使用的技術不同,就再寫一次。

    另外的情形則不一定是寫軟體的打混戰的高手,而應該說是一個團隊中的成員所發生的事情。例如在一個軟體開發團隊中,AB在寫自自的應用程式時,AB都可能同時在撰寫類似的程式碼,例如A可能寫了select * from employee,而B也正寫select e.ID, e.Name, … from employee e。或是A需要一個方法叫做GetSeminarQA以便得到研討會所有的QA問題,而B也在寫類似的方法,只是A使用Delphi程式語言,而B則使用Java。許多有對專案開發有經驗的人都知道,一旦當專案完成(或是完成不了)之後,如果使用Audit/Metric工具來檢查專案程式碼,就會發現許多,許多類似的程式碼不斷的出現在專案的不同的程式中。

    也許重構正是因為那些聰明的人在檢視了以往的程式碼之後發現原來自己正是打混戰的高手因此而發展出來的技術。

    混戰高手需要改變嗎? 我也不知道,各人愛好不同,讓我們看看下面的一個企業邏輯模型。DevCoSeminar類別定義了三個方法,其中的GetClosedQAs方法可以回傳一個研討會所有的QA問題,那麼我們應該如何實作GetClosedQAs?

    如果這去問Java的朋友,他們會用Java + JDBC或是Java + Hibernate來實作,如果詢問C#的朋友,他們馬上會用C#+ADO.NET在數秒之內完成,Delphi? 那選擇更多了,Delphi+dbExpressDelphi+ADODelphi+,,,VB? PHP? Python? 嗯這個問題太簡單了,許多人也許不根本不屑一顧。

    但是仔細看看上面的模型,不管使用JavaC#Delphi或是其他的程式語言,上面的企業邏輯規則都是一樣的,不會因為選擇的程式語言不同而改變,最多是實作方法不同的,那麼您也許會問然後呢?

    讓我們換個角度想想,如果我們在企業邏輯模型中就完成GetClosedQAs方法呢?

    看看下面的圖形,我在GetClosedQAsBody特性值中直接使用了OCL來撰寫GetClosedQAs方法。為什麼要使用OCL? 因為這個企業邏輯規則是一樣的,不會因為用戶端的程式語言,平台或是技術而改變。

     

    有了上面的企業邏輯模型之後,對於開發人員人說仍然必須搞清楚如何在用戶端使用企業邏輯模型,這不困難,讓我們愛揮一下技術人員的天賦,追根究底的往下挖。

    一旦在企業邏輯模型中定義了GetClosedQAs之後,ECO會自動產生如下的程式碼:

        [UmlTaggedValue('Eco.Body', 'self.hasQA->select(closed)->asSet()')]

        function getClosedQAs: System.&Object;

    ECO使用了.NET的屬性來定義DevCoSeminar類別的getClosedQAs方法。再往下看,getClosedQAs的實作如下:

    function DevCoSeminar.getClosedQAs: System.&Object;

    type

      TArrayOfobject = array of &object;

    begin

      Result := (System.&Object(Self.AsIObject.Invoke('getClosedQAs', New(TArrayOfobject, 0))));

    end;

    嗯,getClosedQAs呼叫了IObjectInstanceInvoke來執行'getClosedQAs',回傳的結果是一個包含執行結果物件的物件陣列,。而IObjectInstance有如下的定義:

        public interface IObjectInstance: IObject

        {

            IObjectStateMachine StateMachine { get; }

            object Invoke(IMethod method, object[] parameters);

            object Invoke(string methodName, object[] parameters);

            object Invoke(IMethod method, IElement[] parameters);

        }

    OK,很好,現在只要我們搞清楚如何擷取出getClosedQAs回傳的結果就可以取得依照企業邏輯模型定義的getClosedQAs方法的運算結果。下面的程式碼就是使用Delphi做為用戶端程式語言來存取執行的結果:

    procedure TWinForm.btnQAs_Click(sender: System.Object; e: System.EventArgs);

    var

      aSeminar : DevCoSeminar;

      anObject : System.&Object;

    begin

      aSeminar := Self.cmhSeminar.Element.AsObject as DevCoSeminar;

      anObject := aSeminar.getClosedQAs;

      HandleQAs(anObject);

    end;

    現在唯一的難題就是如何從getClosedQAs方法回傳的型態為System.Object的結果值出運算結果。在這裡讓我給使用ECO的朋友一個暗示,對於像getClosedQAs方法執行OCL並且回傳結果物件串列的方法,這個回傳的結果都實作了ICollection介面,因此我們只需要把執行結果轉變型態為ICollection介面就可以使用Delphifor…in迴圈或是C#foreach迴圈取得結果,例如下面的程式碼就範例了從getClosedQAs的物件串列中取出所有符合條件的QA物件:

    procedure TWinForm.HandleQAs(anObject: System.&Object);

    var

      aQA : QA;

    begin

      for aQA in (anObject as ICollection) do

      begin

        Self.lbResult.Items.Add(aQA.Question);

      end;

    end;

    執行一下上面的程式碼,我們就可以順利的得到正確的結果,下圖就是一個範例應用程式的執行結果畫面:

     

    對於C#的朋友,程式碼和Delphi是一樣的,關鍵在企業邏輯模型,任何的用戶端程式語言都可以重覆使用企業邏輯模型中的設計:

    private void button1_Click(object sender, System.EventArgs e)

    {

      DevCoSeminar aSeminar = cmhSeminar.Element.AsObject as DevCoSeminar;

      System.Object anObject = aSeminar.getClosedQAs();

      HandleQAs(anObject);

    }

     

    我還是要問,您感覺到了什麼? 是繼續讓獨自的開發人員在不同的程式碼中仍然撰寫各自的程式碼? 為每一個類似的情形不斷的撰寫重覆的程式碼? 為不同的程式語言不斷的撰寫重覆的程式碼? 為不同的平台不斷的撰寫重覆的程式碼? 我想這沒有標準的答案,每個人的風格不同,有人永遠是打混戰的高手,有人卻能夠在知道了新的選擇之後開始思考這些新的選擇會或是可以帶來什麼改變。

    也許學習MDA/DDA/ECO的價值之一是開始讓我們思考新的選擇以及新的選擇可能帶來的影響是什麼!

    Comments (9)

    Please wait...
    Sorry, the comment you entered is too long. Please shorten it.
    You didn't enter anything. Please try again.
    Sorry, we can't add your comment right now. Please try again later.
    To add a comment, you need permission from your parent. Ask for permission
    Your parent has turned off comments.
    Sorry, we can't delete your comment right now. Please try again later.
    You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
    Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
    Complete the security check below to finish leaving your comment.
    The characters you type in the security check must match the characters in the picture or audio.

    To add a comment, sign in with your Windows Live ID (if you use Hotmail, Messenger, or Xbox LIVE, you have a Windows Live ID). Sign in


    Don't have a Windows Live ID? Sign up

    No namewrote:
    wow gold!All wow gold US Server 24.99$/1000G on sell! Cheap wow gold,wow gold -230152196842989
    June 24
    No namewrote:
    国内最大的升降机、升降台、液压升降机专业生产厂家之一,我公司生产的升降机、升降台、升降平台、液压升降机每个部件都选自国内优秀企业;还可根据客户要求采用进口 ...南京麦瑞木托盘制造厂是专业生产木托盘企业,是中国木托盘知名品牌,“麦瑞牌”木托盘是上海市名牌产品,是中国木托盘协会会员,是中国物流与采购联合会会员, ... 仓储笼采用优质钢材经冷扎硬化焊接而成,强度高、装载能力大、可叠四层、实现仓储立体化,不同型 号、不同规格的仓储笼承重为0.8T~2.0T。折叠式结构,装载、周转、 ...Makers and sellers of metal pallets. ... Metal pallets often are preferable to standard wooden or plastic pallets when you need to move or store heavy loads ...The size of wood pallets is specified as the stringer length, followed by the ... of material and design choices, wood pallets are still used to manufacture ...Plastic Pallets manufacturers, service companies and distributors are ... Company Profile: Manufacturer & distributor of plastic pallets that meet the needs ...南京货架,南京货架厂,南京货架公司|上海货架,上海货架厂,上海货架公司|无锡货架,无锡货架厂,无锡货架公司|苏州货架,苏州货架厂,苏州货架公司|北京货架,北京货架厂,北京货架公司|货架公司,北京货架公司,宁波货架公司|广州货架,广州货架厂,广州货架公司|服装货架,服装货架设计,广州服装货架|超市货架,北京超市货架,上海超市货架|仓储货架,北京仓储货架,上海仓储货架|托盘货架,重型托盘货架,托盘货架公司|货架厂,广州货架厂,北京货架厂|仓库货架,北京仓库货架,上海仓库货架|深圳货架,深圳货架厂,深圳货架公司|重型货架,次重型货架,成都重型货架|精品货架,北京精品货架,广州精品货架|天津货架,天津货架厂,天津货架公司|角钢货架,角钢货架厂,万能角钢货架|沈阳货架,沈阳仓储货架,沈阳货架公司|青岛货架,青岛货架公司,青岛仓储货架|轻型货架,北京轻型货架,角钢轻型货架|山东货架,山东货架厂,山东货架公司|杭州货架,杭州货架厂,杭州货架公司|中型货架,上海中型货架,广州中型货架|济南货架,济南货架厂,济南货架公司|郑州货架,郑州货架厂,郑州货架公司|展示货架,上海展示货架,产品展示货架|库房货架,货架厂,北京库房货架|武汉货架,武汉货架厂,武汉货架公司|河南货架,河南货架厂,河南货架公司|货架设计,仓库货架设计,货架设计公司|不锈钢货架,深圳不锈钢货架,上海不锈钢货架|阁楼货架,阁楼式货架,阁楼货架公司|移动货架,电动移动货架,北京移动货架|物流货架,上海物流货架,仓储物流货架|佛山货架,佛山货架厂,佛山货架公司|定做货架,杭州定做货架,天津定做货架|江门货架,贯通式货架,防静电货架|宁波货架,宁波货架厂,宁波货架公司|石家庄货架,石家庄货架厂,石家庄货架公司|重庆货架,重庆货架厂,重庆货架公司|河北货架,河北货架厂,河北货架公司|哈尔滨货架,哈尔滨货架厂,哈尔滨货架公司|悬臂货架,悬臂式货架|图书货架,广东图书货架,深圳图书货架|浙江货架,浙江货架厂,浙江货架公司|货架制作,北京货架制作,上海货架制作|西安货架,西安货架厂,西安货架公司|木托盘,上海木托盘,天津木托盘|北京木托盘,苏州木托盘,宁波木托盘|上海木托盘,广东木托盘,青岛木托盘|武汉木托盘,山东木托盘,南京木托盘|钢制料箱,折叠式料箱,网格式料箱|上海仓储笼,南京仓储笼,天津仓储笼|仓储笼图片,折叠仓储笼,折叠式仓储笼|北京仓储笼,广州仓储笼,宁波仓储笼|货架|托盘|料箱|仓储笼|手推车|登高车|置物架|垃圾桶
    May 8
    yyqwrote:
    IT当成嗜好是一种境界。
    Aug. 24
    Picture of Anonymous
    (没有名称) wrote:
    请问大师,我们刚买了BDS2006Ent,请问能否免费升级到 TurboDelphi?
    Aug. 23
    Jonny Linwrote:
    To: 李維老師:
                           其實身為Delphi的使用者 , 第一個面臨到的就是對於新技術的詳細文件太過缺乏 ; 雖然有李維老師不辭辛勞的苦苦支撐 , 可是還是希望DevCo能正視這個問題 , 是不是該推行類似MS的一些技術學習研討會? (在新產品推出之前 , 來點熱身運動!!) , 相信也對之後產品的推動有許多助益 ; 不但能讓客戶從產品推出到應用的時程縮減 ; 更能增加Delphi使用族群對DevCo的信心!!

    小小建議....
    Aug. 21
    Picture of Anonymous
    (没有名称) wrote:
    Turbo 系统产品的定价,有很大的吸引力,相信购买的会多很多。不知道在中国如何定价?
    Aug. 21
    維 李wrote:
    >打痛苦混戰?Borland IDE再贴切不过了。Win32 Native、Java平台、.Net平台、Linux Native,IDE东挡西杀,在Win32 Native风采犹存,
    看來你心中有氣,也許對Borland是恨鐵不成鋼, 但是我必須說一些事情讓你知道.
     
    >在Java平台打败对手了吗?
    當然, JB 7/JB8時JBuilder的確是世界第1的Java開發工具, 當然打敗了對手. 只是後來Borland把JBuilder賺得的利潤都拿去做ALM, JB和Delphi/CBuilder一樣得不到足夠的資源, 自然就萎縮了.
     
    >在.Net平台打败对手了吗?
    還沒, 不過在MS平台下沒人打得過MS, 問題是能不能有一定的市場佔有率, 像Delphi最強的時候不但有一定的佔有率, 而且有很好的利潤可以充分使用來開發更好的Delphi, 讓Delphi在產品面比MS的工具更好, 如此才能在MS平台中存活.
     
    >在Linux Native做深入了吗?令人深思。
    Kylix到了Kylix 3時在Linux的開發工具已經是第1佔有率的工具, 只可惜用的人多, 買的人少, Kylix Team沒有足夠的利潤/資源繼續做的更好. 這是市場的特性, 不光是Borland的問題.
     
    Aug. 19
    Picture of Anonymous
    (没有名称) wrote:
    Borland IDE在与各大平台对抗中消耗了精力,如果专注Native(Win32与Linux)开发,把Native发挥到极致,不用任何平台仍然出色完成任务,相信仍能吸引很多用户。
    Aug. 18
    Picture of Anonymous
    (没有名称) wrote:
    打痛苦混戰?Borland IDE再贴切不过了。Win32 Native、Java平台、.Net平台、Linux Native,IDE东挡西杀,在Win32 Native风采犹存,在Java平台打败对手了吗?在.Net平台打败对手了吗?在Linux Native做深入了吗?令人深思。网友提到做插件的想法很奇特,可以做几个模块接口,进行选装,如果用Win32 Native就装Native接口模块+任一语言模块,如果需要.Net开发,就装.Net平台+.Net接口+任一语言模块。这样或许IDE开发痛苦混战的情况会减轻。否则,新的Turbo会不会回到从前C++Builder总滞后的情况呢?
    Aug. 18

    Trackbacks

    The trackback URL for this entry is:
    http://gordonliwei.spaces.live.com/blog/cns!CCE1F10BD8108687!1115.trak
    Weblogs that reference this entry
    • None