Time of Update: 2018-12-03
Adrian同志有一篇關於Aspect Oriented Programming的Blog The Ted Neward Challenge (AOP without the buzzwords),俺非常的喜歡。這篇文章中文翻譯過來可以是“無廢話AOP”,它從一個脫離了具體實現手段的視角,用簡單清晰的語言向我們表達了Aspect Oriented Programming的本意:盡量將需求和實現的關係由1:N逼近至1:1。俺也非常希望能整出這麼一個“無廢話Agent Oriented
Time of Update: 2018-12-03
最近忙於美化介面,然而wince上面提供的功能比案頭上要少的多,網上可供選擇的控制項也少的可憐(後來發現還是有些的,沒有調研就沒有發言權啊!:()。好在功夫不負有心人,借鑒別人的代碼,也給我倒騰出帶圖片的按鈕、不規則形狀按鈕、可在每行中顯示圖片的listctrl。希望最近有時間可以把這些整理出來寫成部落格,這次先不提這。這裡要說的讓人迷惑的Custom Draw與Owner draw。可能有不少人對於這兩個概念不怎麼瞭解,或者沒有聽說過,更不用說它們有什麼區別了!不幸的是,我之前也是其中一個..
Time of Update: 2018-12-03
Agent之前-Object世界 在說起Agent之前,俺們還有必要先敬拜一下Agent的前輩Object,因為Agent實際上是由Object“進化”而來的。這話說出來,可能有些讀者同志不太高興了,Object有什麼不好嗎?現在這麼多複雜的系統,不都是基於OO的思想設計出來的嗎?
Time of Update: 2018-12-03
進入Agent世界-什麼是Agent? 在前面的討論中,說道了一下Object讓俺們感覺不是很爽的地方。總結下來:OO並不是對現實世界最貼切的類比。那麼什麼東東可以比OO更加貼近地來類比現實世界呢?就目前看來,還是Agent可以擔當起Object接班人的這個角色。 這裡多插一段話。俺們可以注意到,不論是Object還是Agent,他們都有比較深的理論淵源,同時以指導實際軟體開發為其價值導向。目前在軟體開發過程中,俺們大量地使用著Object的概念,所以前面討論凡是涉及到Object的,俺們都盡量
Time of Update: 2018-12-03
前段時間一直周旋於各種有趣且辛苦, 或者無趣且更辛苦的事情當中, 雖然其間也切換到其他好些不同的技術領域, 但一直沒有放棄在AOP方面的關注思考. 前面之所以沒有能接著AOP這個話題繼續和大家聊下去, 是因為感覺自己沒有足夠的精力和空閑來將這些想法沉澱下來, 並回鍋為簡單直白, 易於消化和理解, 並能引發思考的東西. 這幾天, 出差在外, 工作之餘免去了灶台內外的忙活. 油煙味少了, 人也覺得清爽許多; 閑暇多了, 就免不了想爬爬格子. OK, 閑話到此為止,
Time of Update: 2018-12-03
在OpenVPN中,一種很不錯的記憶體管理方案是基於鏈表的,該方案的實現使用了一個gc_arena結構體,該結構體的作用就是將所有的動態分配的記憶體塊收集彙集起來,然後就可以在一個地方統一釋放,c語言對動態記憶體管理的劣勢就是無法跟蹤動態記憶體,因此也就將管理動態記憶體的事情交給了程式員來完成,然後就有了無數次的由於記憶體泄露導致的bug,雖然c++實現了很多記憶體管理方案,比如智能指標之類的,但是其複雜性無不揉進了c++這種重量級語言本身,使得本已複雜的語言帶上特定的庫之後更加臃腫,並且在c+
Time of Update: 2018-12-03
同事說omni_thread為什麼要搞得那麼複雜呢?對了,先問一下,你有沒有用過這個類?其實,這就是一個對系統線程對象Thread的抽象,以使應用程式可以在不同平台上方便移植,而不論底層具體的執行緒模式。起初,這個世界是沒有Thread這個概念的,只有Process。我們知道,當初作業系統就是用Process來抽象計算任務的,並負責對Process進行調度。對於單CPU系統,一個時間裡只有一個Process能佔有CPU而得以執行。後來,不知道從什麼時候開始,人們發明了Thread這個概念,Thr
Time of Update: 2018-12-03
我一直認為,很多道理都隱藏在我們的周圍,只不過我們沒有認識到罷了。在這裡我先從一個簡單的故事開始。這個故事我已經在很多場合講過。在找到更好的故事之前,我將一直用它。 我說的這個故事的名字叫“總經理與秘書”的故事。這裡沒有任何桃色新聞,這點恐怕會讓某些人失望:)。 上海的一家公司的總經理A明天需要到北京參加一個非常重要的會議,他叫過來自己的秘書B吩咐道:“B小姐,請幫我訂一張明天早上9點到北京的機票。” 第二天,A總經理來到公司向B秘書拿機票,B秘書回答道:“昨天機票沒有訂到
Time of Update: 2018-12-03
前面說過了viewController的一些基本注意事項。這裡針對不同的viewController類,描述一下各自用法的注意事項。至於每種viewController的基本用法,可以參看蘋果的官方文檔”View controller Programming Guide for IOS”,上面對UINavigationController,UITabBarController,UIModelViewController等一些常見的viewController解釋的非常清楚,並且官方還專門
Time of Update: 2018-12-03
電腦運行起來後,一切都很正常,並且很多理論你都可以在很多資料上學到,然而,一切是如何開始的呢?開始意味著誕生,生活是乏味的,然而誕生一個生命卻是需要十月懷胎的,一個生命總是在充滿激情與暢想的十月之後誕生的,電腦的運行也不例外,在電腦中,對於運行而言最重要的東西其實不是作業系統,也不是應用程式,而是BIOS或者類似的東西,它裡面記錄著一張拓撲圖,這張拓撲圖描述了電腦的硬體是如何串連在一起的-比如網卡晶片在第幾條pci匯流排上,以及各個硬體是如何配置的-比如時鐘的值或者啟動順序,有了這張圖,以後的作
Time of Update: 2018-12-03
前面,我們分析了訊息的基本理論和基本的函數及用法,接下來,我們將進一步討論訊息傳遞在MFC中的實現。MFC訊息的處理實現方式初看MFC中的各種訊息,以及在頭腦中根深蒂固的C++的影響,我們可能很自然的就會想到利用C++的三大特性之一:虛擬機器制來實現訊息的傳遞,但是經過分析,我們看到事情並不是想我們想象的那樣,在MFC中訊息是通過一種所謂的訊息映射機制來處理的。為什麼呢?在潘愛民老師翻譯的《Visual C++技術內幕》(第4版)中給出了詳細的原因說明,我再簡要的說一遍。在CWnd類中大約有11
Time of Update: 2018-12-03
Cast的妙用:泛用LINQ 語句 文/黃忠成 什麼是泛用LINQ 語句 泛用LINQ語句的概念很簡單,在一些情況下,我們會有需求使用同一段程式碼來對不同資料表做查詢,這在ADO.NET中很容易達到,見下例:static void PrintCustomerID(SqlDataReader reader){
Time of Update: 2018-12-03
一、前言 程式設計中,錯誤處理必不可少,而且通常要佔用很大的篇幅。本回書著落在 COM 中的錯誤(異常)的處理方法。 在組件程式中,如果遇到錯誤,一般有兩個方式進行處理。 二、簡單返回 對於比較簡單的錯誤,直接返回表示錯誤原因的
Time of Update: 2018-12-03
#include "stdafx.h"#include <stdlib.h>//float **get_mem(int i, int j){ float **p = (float**)malloc(i * sizeof(float)); for( int m = 0; m < j; m++) { p[m] = (float*)malloc(sizeof(float)); } return p;}//int main(int argc, float*
Time of Update: 2018-12-03
什麼是代碼產生?代碼產生,就是Code Generation,想必大家都不會陌生。我們使用Visual Studio等開發工具的時候,很多代碼架構都是自動產生。初步的印象就是,代碼產生可以減少重複工作。但是,如果更加深入的去看,就會看到,其實不僅代碼架構可以自動產生,連編譯器都可以認為是代碼產生器—從進階語言到機器語言(這個過程太自然了,以致於我們已經不認為是代碼產生了)。所以,代碼產生有不同的層次,最低級的是IDE那樣的函數架構,其次是MFC那樣的工程嚮導,再進階的一點應該是
Time of Update: 2018-12-03
一、所有者繪製(owner-draw)和自訂繪製(custom-draw)一、給控制項添加排序功能report風格的list控制項很多情況下都需要支援排序功能,而且最好支援按不同列進行排序。CListCtrl的類方法SortItems支援排序功能,但是在排序過程中,兩個資料真正的比較過程是通過SortItems的第一個參數指向的回調比較函數來完成的。這個函數通過比較SetItemData函數設定的每個Item對應數值,返回一個代表比較結果的值,SortItems便可以依據這個傳回值進行排序實現。
Time of Update: 2018-12-03
C++等語言的“物件導向”是原始碼層級的,是由編譯器為你呈現的“一片‘物件導向’的假象” ,它只限於編譯器的這一頭(輸入),編譯器的另一頭(輸出)同樣是一堆十分“physical”的二進位指令序列,和C等面向過程的語言的編譯輸出沒有本質區別。所以NewB程式員說,“我能用C寫出和C++同樣編譯結果的東東來”,NewC程式員也說,“My
Time of Update: 2018-12-03
外掛程式系統概述普通的系統,在編譯發布之後,系統就不允許變更或擴充了,如果要進行某個功能的擴充,則必須要修改代碼重新編譯發布。使用外掛程式可以很好地解決這個問題。外掛程式概念首先由開發人員編寫系統架構,並預先定義好系統的擴充借口。外掛程式由其他開發人員根據系統預定的介面編寫的擴充功能,實際上就是系統的擴充功能模組。外掛程式都是以一個獨立檔案的形式出現。對於系統來說並不知道外掛程式的具體功能,僅僅是為外掛程式留下預定的介面,系統啟動的時候根據外掛程式的配置尋找外掛程式,根據預定的介面把外掛程式掛接
Time of Update: 2018-12-03
對執行個體化 ADO 事件模型的方式進行常規說明。下面是一個在由 #import 偽指令建立的環境中執行個體化事件模型的特定範例。 常規說明中使用 adoint.h 作為方法聲明的引用。但是由於使用 #import 偽指令,因此常規說明中的一些細節需要稍微做些更改。 #import 偽指令將 typedef、方法聲明資料類型和按鍵組合分解為其基本格式。所有必須覆蓋的純虛擬方法都被加上首碼“raw_”。 某些代碼只反映編碼樣式。 Advise 方法使用的指向 IUnknown 的指標是通過
Time of Update: 2018-12-03
FastDFS是一個開源的輕量級Distributed File