1. 程式人生 > >淺談程式碼分層:構建模組化程式

淺談程式碼分層:構建模組化程式

Example C中的模組組織

很多C程式碼寫得少的C++程式設計師甚至對一個大型C程式中的模組組織毫無概念。這是對其他技術接觸少帶來的視野狹窄的可怕結果。

在C語言的世界裡,並不像某些C++教材中指出的那樣,佈滿全域性變數。當然全域性變數的使用也並不是糟糕設計的標誌(goto不是魔鬼)。一個良好設計的C語言程式懂得如何去抽象、封裝模組/軟體層。我們以Lua的原始碼為例。

lua.h檔案是暴露給Lua應用(Lua使用者)的直接資訊源。接觸過Lua的人都知道有個結構體叫lua_State。但是lua.h中並沒有暴露這個結構體的實現。因為一旦暴露了實現,使用者就可能會隨意使用其結構體成員,而這並不是庫設計者所希望的。 封裝資料的實現,也算是構建模組化程式的一種方法。

大家都知道暴露在標頭檔案中的資訊,則可能被當作該標頭檔案所描述模組的介面描述。所以,在C語言中任何置於標頭檔案中的資訊都需要慎重考慮。

相對的,我們可以在很多.c檔案中看到很多static函式。例如lstate.c中的stack_init。 static用於限定其修飾物件的作用域,用它去修飾某個函式,旨在告訴:這個函式僅被當前檔案(模組)使用,它僅用於本模組實現所依賴,它不是提供給模組外的介面! 封裝內部實現,暴露夠用的介面,也是保持模組清晰的方式之一。

良好的語言更懂得對程式設計師做一種良好設計的導向。但相對而言,C語言較缺乏這方面的語言機制。在C語言中,良好的設計更依賴於程式設計師自己的功底。

相關推薦

程式碼分層構建模組程式

Example C中的模組組織 很多C程式碼寫得少的C++程式設計師甚至對一個大型C程式中的模組組織毫無概念。這是對其他技術接觸少帶來的視野狹窄的可怕結果。 在C語言的世界裡,並不像某些C++教材中指出的那樣,佈滿全域性變數。當然全域性變數的使用也並不是糟糕設計的標誌(goto不是魔鬼)。一個良好設計的C語

[珠璣之櫝]程式碼正確性迴圈不變式、斷言、debug

  這個主題和程式碼的實際寫作有關,而且內容和用法相互交織,以下只是對於其內容的一個劃分。《程式設計珠璣》上只用了兩個章節20頁左右的篇幅介紹,如果希望能獲得更多的例項和技巧,我比較推崇《程式設計實踐》 (Practise of Programming)、《程式設計精粹:編寫高質量C語言程式碼》(Writin

商品推薦如何猜中用戶的心思?

維度 活動 不同 -i 鄰居 表示 找到 包括 一起 去商場前,你告訴自己今天只買T恤,出商場時,你還是拎了大包小包……導購員看你摸了摸連衣裙,讓你免費試穿,結果你這一穿就不願脫下了,而且一件接一件。導購猜測顧客喜歡什麽,推薦顧客試穿,滿足雙方各自的心理訴求來達成交易。電

Android進階——Java註解實戰之APT構建模組的第一步

前言 APT的學習要花點時間去掌握和實踐的,短時間內只能掌握知識點,更多的是在實戰中去實踐。其實,APT就是一種工具而已,只要用多了,自然就會熟練了,不過要想實踐之前,還是必須把基礎知識學好才能實戰進入開發。文章會從基礎用例講解知識點,然後再通過實戰進行實踐 APT簡介 AP

程式碼規範&&基礎除錯&&幾道面試題

廢話篇:本文由CSUST的FINAL實驗室的LX創作,用途是給予CSUST的小鮮肉們一些關於C語言程式碼規範的一些基本知識,若本文有什麼錯誤或是表述不清之處,歡迎留言討論指正。 程式碼規範: 在講程式碼規範之前,我想給大家看一句感人肺腑的註釋名言來告誡各位以後的優秀程

董春陽竹簡app績效暖心,工資暖胃

大小企業都感覺員工越來越難招、越來越難管、越來越難滿足,企業似乎已經反轉到了僱傭關係的弱勢一方。 當我們覺得人力資源管理工作越來越難的時候,很可能就是我們的管理思路與企業人力資源實際情況脫節,不同的人力資源模組工作沒有形成合力,甚至是在互相抵消。 01 劃分:績

HTML5前端教程分享前端模組開發

1. 命名衝突 首先從一個簡單的習慣開始。 由於以前一直做 JavaEE 開發的緣故,在 JavaScript 開發中,我已經習慣將專案中的一些通用功能抽象出來,形成一個個的獨立函式,以便於實現程式碼複用,如: function css(element, attr

@angular前端專案程式碼優化構建Api Tree

前顏(yan) 在前端專案的開發過程中,往往後端會給到一份資料介面(本文簡稱api),為了減少後期的維護以及出錯成本,我的考慮是希望能夠找到這麼一種方法,可以將所有的api以某種方式統一的管理起來,並且很方便的進行維護,比如當後端修改了api名,我可以很快的定位到該api進行修改,或者當後端添加了新的api

運維改革探索(二)構建視覺分散式運維手段

作者介紹 朱祥磊,山東移動BOSS系統架構師,負責業務支撐系統架構規劃和建設。獲國家級創新獎1項、通訊行業級科技進步獎2項、移動集團級業務服務創新獎3項,申請發明專利13項。 工具篇:構建視覺化分散式運維手段 工欲善其事,必先利其器。上篇我們已經詳細分享了監控相關的知識,然而運維視覺化,除了構造視覺

物件中的成員序列問題

       Java物件序列化時參與序列化的內容包含以下幾個方面。         第一、屬性,包括基本資料型別、陣列以及其他物件的應用。         第二、類名。         不能被序列化的內容有以下幾個方面。         第一、方法。         第二

知識圖譜2-【知識圖譜的構建技術】

轉變 傳統的文字資訊抽取 =》 現在的知識發現 傳統的文字 =》 現在的海量資料來源 傳統的預先指定抽取物件 =》 現在的Open domain 新的核心任務 : 與現有知識庫的整合 知識圖譜的核心技術 高價值資訊檢索 知識連結 開放抽取

如何利用maven eclipse構建模組程式

當一個專案足夠大的時候,通過需要多個專案協作來完成一個大專案。那麼這種專案怎麼構建呢? 現在以eclipse和maven為例,講述如何構建一個大型專案的工程框架。 首先開啟eclipse,點選File,選擇new maven project,如下: 一步步往下構建mav

openstack中鑑權模組keystone

    由於工作需要對於研究openstack中鑑權部分已有大半年,從G版本到現在的havana,期待著Icehouse,雖然期間也零零碎碎的接觸過別的模組,但是始終keystone才是我的主場,下面廢話也不多說,進入正題。     keystone中最容易讓人迷惑的不是每

React系列(五)NodeJS模組操作

歷史上,JavaScript一直沒有模組(module)體系,無法將一個大程式拆分成互相依賴的小檔案,再用簡單的方法拼裝起來。其他語言都有這項功能,比如Ruby的require、Python的import,甚至就連CSS都有@import, 但是JavaScri

圖片載入逐行掃描VS交錯掃描

一,前言 最近在不斷地擴充自己web開發的知識面,看得比較泛,難得五一假期就在學習之餘實踐一下,畢竟紙上得來終覺淺,況且“紙上”的不一定都對,之前看了一篇部落格講圖片載入的,博主大概是淘寶前端團隊的吧,講得很透徹,分享一下: 雖然是10年的文章了,但是鑑

opencv3.2中各個模組的簡介

3.2版本的模組說明:Opencv3.2模組 首先開啟opencv_modules.hpp檔案,可以看到對於各個功能模組的定義如下: This file defines the list of modules available in current b

Java類載入的初始階段

類載入的初始化階段對類變數賦予正確的值。主要有兩種初始化方式,一種是通過類變數初始化語句;一種是靜態初始化語句。如下述程式碼所示,前者是類變數初始化語句,後者是靜態初始化語句。 public class Example1 { static int

Generics(泛型、引數型別)

        在Java5中,引入了Generics(泛型、引數化型別)的概念。泛型允許編寫可作用於任意型別的類,但直到宣告類的例項時,才指定特定的型別。因為此型別不是作為類定義的一部分而指定的,所以該類成為一般的、獲得對任意指定的型別起作用的能力。這個概念應該偷師於.Ne

Express 4.0 Router 模組

Express 是目前 node 社群最主要的 Web 框架,前不久剛剛升級到了 4.0 版本。與 3.x 版本比,4.0 版本擁有一個全新設計的 Router 模組,開發者可以更方便的對 middleware 進行隔離與重用。 Express 3.x 時代的中介軟體

程式碼段加密原理(防止靜態分析)

在軟體安全裡,有一種保護手段叫加密,一般情況下都是為程式碼段加密,使原本的程式碼無法被靜態分析,只能動態除錯。 涉及到的知識有:PE檔案結構,程式碼重定位,shellcode。 程式碼加密時可用各種演算法組合起來使用,只要保證解密時用逆推的方法還原成原始碼即可,下面例子當中用的是最簡單的異或加密 由於博主也是