反思異常、運算式和空在 上一期文章 中,我介紹了 Java 下一代語言用來消除 Java 語言中華而不實的東西和複雜性的創新方式。在這一期 文章中,我將展示這些語言如何消除 Java 的一些瑕疵:異常、語句與運算式,以及圍繞 null 的邊緣情況。運算式Java 語言從 C 語言那裡繼承的一項傳承是區分程式設計語言 和編程運算式。Java 語句的樣本包 括使用 if 或 while 的程式碼,以及使用 void 來聲明不會返回任何值的方法的程式碼。運算式(比如 1 + 2
如果說難題最難的部分是基本概念,可能很多人都會持反對意見,但實際上也確實如此。 我高中的時候學物理,老師抓的重點就是概念——概念一定要搞清,於是難題也 成了容易題。如果你能分析清楚一道物理難題存在著幾個物理過程,每一個過程都遵守那一 條物理定律(比如動量守恒、牛II定律、能量守恒),那麼就很輕鬆的根據定律列出這個過程 的方程,N個過程必定是N個N元方程,難題也就迎刃而解。即便是高中的物理競賽難題,最難
Visual C++對JPEG等常見圖形格式的支援不夠一直是為人所詬病的缺陷,相比起來,Delphi/C++ Builder在這方面就要強得多了。由於JPEG是實際應用中經常使用的圖形格式,如果你是Visual C++使用者的話,自然會想如何讓Visual C++能夠處理JPEG圖形。雖然網路上現在已經有了不少能夠處理JPEG圖形的Visual C++庫,但是別人的東西用起來總有點不那麼得心應手,而且經常有一些限制,比如有名的ImageObject庫要求必須靜態連結到MFC
在MFC開發環境中,當運行退出了,Visual Studio會在輸出視窗提示是否有記憶體流失。也可以藉助MFC類CMemoryState動態地檢測並輸出記憶體流失資訊。在非MFC架構中,需要藉助CRT函數實現這些功能。1. 調用_CrtDumpMemoryLeaks()函數會在輸出視窗中輸出當前的記憶體流失。若在程式開始處加上:_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF
在Windows系統中,各個應用程式(進程)之間常常需要交換、傳遞資料,這就要解決進程間的資料通訊問題。在最初的16位Windows3.x系統中,所有Windows應用程式共用單一地址,任何進程都能夠對這一共用地址空間的資料進行讀寫操作。隨著Windwos98、WindowsNT、Windows2000等32位的作業系統的出現,規定每個進程都有自己的地址空間,一個Windows進程不能存取另一個進程的私人資料,也就是說,雖然兩個進程可以用具有相同值的指標定址,但所讀寫的只是它們各自的資料,這樣就
隨著Microsoft憑藉Windows在作業系統上取得的巨大成績,Windows使用者介面也日益成為業界標準。統一的介面給廣大使用者對應用軟體的學習與使用帶來了很大方便。但每天都面對同一副面孔,日久天長難免會產生一些厭倦,想開發一些"離經叛道"的應用程式,如果能夠一改Windows千篇一律的"標準"介面,一定會給使用者帶來一種清新的感覺。標準Windows應用程式視窗一般為帶有標題列的淺灰色矩形外觀,因而"異形"對話方塊/視窗也主要是
說明:以前本人蔘與個一個電子雜誌項目,當時要求實現類比現實生活中的雜誌翻頁動畫效果,別人推薦了這篇文章,最後達到了我想要的效果,今天嘗試把這篇文章翻譯了一下。希望對英語水平不太好的同行有協助。如果你的英語水平足夠好,我推薦你閱讀英文原文,網址是:http://www.codeproject.com/KB/GDI-plus/TurnThePage.aspx,同時希望大家原諒本人的翻譯水平。介紹圖1
本文配套源碼比較 設計模式 常用程度 適用層次 引入時機 結構複雜度 Abstract Factory 比較常用 應用級 設計時 比較複雜 Builder
意圖用一個中介對象來封裝一系列對象的互動。中介者使得各對象不需要顯式相互引用,從而使其鬆散耦合,而且可以獨立地改變它們之間的互動。情境我們知道,一個網路遊戲往往有很多大區。每一個大區可以是一組伺服器,也可以是多組伺服器,在這裡假設一個大區是一組伺服器。為了效率,一般每個大區都會有一個資料庫,玩家的建立角色、儲值、消費行為只是在這一個大區中有效。現在公司有了新的需求,那就是玩家的一些資訊能在多個大區中共用。比如,在註冊的時候就把玩家的賬戶資訊寫入多個資訊共用的大區,玩家在某個大區中儲值需要&ldq
意圖定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,
意圖將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支援可撤消的操作。情境我們知道,網路遊戲中的用戶端需要不斷把當前人物的資訊發送到遊戲服務端進行處理(計算合法性、儲存狀態到資料庫等)。假設有這樣一種需求,在服務端收到用戶端的請求之後需要判斷兩次請求間隔是不是過短,如果過短的話就考慮可能是遊戲外掛,不但不執行當前請求還要把前一次請求進行復原。暫且把問題簡單化一點不考慮用戶端和服務端之間的通訊來進行程式設計的話,你可能會建立一個Man類型,其中提供了
意圖使多個對象都有機會處理請求,從而避免請求的寄件者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象能處理請求為止。情境假設我們在製作一個遊戲的客服系統,客服有三種角色,分別是普通客服、客服經理和客服總監。玩家在網站中提問後,根據問題的分類和重要性處理的流程不一樣。規則如下:l 分類為1(遊戲問題)和2(角色問題)的問題會由普通客服處理。l 分類為3(儲值問題)和4(賬戶問題)的問題會由客服經理處理。l 普通客服和客服經理都沒有能處理的問題由客服總監進行處理。
意圖允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。情境我們在製作一個網上書店的網站,使用者在書店買了一定金額的書後可以升級為銀會員、黃金會員,不同等級的會員購買書籍有不同的優惠。你可能會想到可以在User類的BuyBook方法中判斷使用者曆史消費的金額來給使用者不同的折扣,在GetUserLevel方法中根據使用者曆史消費的金額來輸出使用者的等級。帶來的問題有三點:l 不用等級的使用者給予的優惠比率是經常發生變化的,一旦變化是不是就要修改User類呢?l 網站在初期可能
意圖定義一系列的演算法,把它們一個一個封裝起來,並且使它們可相互替換。本模式使得演算法可以獨立於它的客戶而變化。情境在開發程式的時候,我們經常會根據環境不同採取不同的演算法對對象進行處理。比如,在一個新聞列表頁面需要顯示所有新聞,而在一個新聞搜尋網頁面需要根據搜尋關鍵詞顯示匹配的新聞。如果在新聞類內部有一個ShowData方法的話,那麼我們可能會傳入一個searchWord的參數,並且在方法內判斷如果參數為空白則顯示所有新聞,如果參數不為空白則進行搜尋。如果還有分頁的需求,那麼還可能在方法內判斷
意圖定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。Template
意圖動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比產生子類更為靈活。情境在設計網路遊戲的武器系統時,開始並沒有考慮到武器的強化和磨損。之後,策劃人員說希望給遊戲增加強化系統和修理系統,那麼我們的武器類型就需要對外提供強化、磨損、修理等方法了。發生這種改動是我們最不願意看到的,按照設計原則,我們希望功能的擴充儘可能不要修改原來的程式。你可能會想到使用繼承來實現,但是策劃人員的需求是有的武器能磨損能修理,不能強化,有的武器能強化,但是不會磨損,有的武器既能強化還能磨損
意圖將抽象部分與實現部分分離,使它們都可以獨立的變化。情境還是說我們要做的網路遊戲,多個情境需要擴充的問題我們已經採用了建立型模式來解決。現在的問題就是,不僅僅是遊戲情境會不斷擴充,而且遊戲的模式也在不斷擴充。比如,除了最基本的戰鬥模式之外,還會有道具模式,金幣模式等。對於這種在多個維度上都會有變化或擴充需求的項目來說,可以考慮引入橋接模式。或許你會說,不管是什麼情境,不管什麼模式,都可以是抽象情境的一個子類,但是,如果這樣的話,4個情境和3種模式就會產生12個子類,而10個情境5種模式就會有5
意圖運用共用技術有效地支援大量細粒度的對象。情境在比較底層的系統或者架構級的軟體系統中,通常存在大量細粒度的對象。即使細力度的對象,如果使用的數量級很高的話會佔用很多資源。比如,遊戲中可能會在無數個地方使用到模型資料,雖然從數量上來說模型對象會非常多,但是從本質上來說,不同的模型可能也就這麼幾個。此時,我們可以引入享元模式來共用相同的模型對象,這樣就可能大大減少遊戲對資源(特別是記憶體)的消耗。範例程式碼using System;using System.Collections;using
意圖為其他對象提供一種代理以控制對這個對象的訪問。情境代理模式非常常用,大致的思想就是通過為對象加一個代理來降低對象的使用複雜度、或是提升對象使用的友好度、或是提高對象使用的效率。在現實生活中也有很多代理的角色,比如明星的經紀人,他就是一種代理,經紀人為明星處理很多對外的事情,目的是為了節省被代理對象也就是明星的時間。保險代理人協助投保人辦理保險,目的降低投保的複雜度。在開發中代理模式也因為目的不同效果各不相同。比如,如果我們的網站程式是通過.NET
用Delphi或者VB編程,在對資料庫中的記錄進行操作的時候,經常用到一個名稱為資料導航器的組件,通過這個組件,可以非常方便的實現對已經綁定到此組件的資料表中的記錄進行瀏覽。那麼在Visual C#是否也存在這樣的組件呢?答案是否定的.但由於Visual C#有著強大的資料庫處理能力,所以可以比較方便的做一個類似於此組件的程式.本文就是來介紹此程式的具體製作過程.一、