2015年1月29日 星期四

Swift學習心得 - 函式使用

  Apple在Swift的網站上是這麼形容的:
Swift。全新程式語言,讓人人可創作精彩 App。
http://i.imgur.com/wTu9s9B.png
    由於iPhone帶動了智慧型手機的風行,也因此開創了一個新的產業:APP開發,近幾年來,我們發現HTML5Javascript和Object-C等等這些在以往相當冷門的語言突然變得很熱門,各種專門課程和教學書籍手冊如雨後春筍般到處都是,周遭的親朋好友若知道你會寫程式,總不忘會再多問一句「那你會不會寫APP?」,彷彿寫APP是現代資訊人必備的行頭之一。
    如果你想開始瞭解一下APP怎麼寫的,也很不幸選了Apple的iOS作為入門的試金石,而且堅持一定原生的(註一),那麼第一次接觸Object-C的經驗肯定讓你苦惱不已,它是源自於C語言,但語法結構又不太一樣,還有一大堆的減號、中括號和大量來自於賈伯斯被趕出Apple自創NextStep公司時代的 NS****函式庫,很多人第一次接觸時便被這些火星文給嚇到而放棄了,轉而學起Java或較易入門的HTML5和JavaScript。
    但語言本應是愈簡單愈好,一個困難到要花費很長的時間和精力才能搞懂學會的語言,它永遠沒有普及的一天,而且也達不到所謂語言的最終目的:溝通;目前我們所處的科技時代,人與機器的溝通方式就是透過程式語言,這個產業要進步,唯有讓更多的人擁有與機器溝通的能力,因此,簡化語言就是最好的方式,蘋果為了讓iOS設備能夠普及世界,在Object-C問世20多年後,終於推出全新的語言Swift,強調簡單易學,一如它的口號:「讓人人可創作精彩 App
    在Swift官網上還提到最令我感興趣的一點,Swift的執行速度竟然比Object-C更快(約2.6倍),大為扭轉一般人對scripting語言慢吞吞的刻板印象,光是這點就值得馬上放棄Object-C改學Swift了。(註二)
    在學習一個新的程式語言時,我們一開始都會先去知道常數和變數的用法、資料的型別表示方法、再來瞭解其基本運算的指令,不過在此我先略過這幾個部份而直接從函式開始,原因是Swift的語法與一般的scripting語言相當近似,所以這些部份在語法上皆大同小異,只要有基本的scripting基礎,你甚至先略過這部份也沒有關係,或者你也可以先到此網站http://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/看一下;而Swift函式的用法則稍微特別一點,因此我將從這部份開始介紹。

函式

基本語法

Swift中的函式很靈活,當它獨立存在時,即我們常見的全域函式,也可以存在於別的函式之中,形成巢狀函式,還可以存在於類別、結構和列舉之中,就是我們俗稱的方法。
Swift函式語法格式:
        func 函式名稱(參數列及型別) -> 回傳值型別 {
            指令…
            return 回傳值
        }
    JavaScript等的scripting語言,函式宣告是不一定需要指定傳入參數型別和回傳值型別的,而且很少用到->之類的字元,不過Swift需要,可以看出Swift雖然號稱簡單,但還是比起一般的scripting語言嚴謹,這是我們需要先熟悉的地方;不過,如果沒有回傳值時,這個->和回傳值型別是可以省略的。下方是一個無回傳值的函式格式,跟一般常見的函式格式很像。
        func 函式名稱(參數列及型別) -> {
            指令…
        }
    接下來,我們來看一個計算長方型面積函式rectangleArea的例子:
    func rectangleArea(width:Double, height:Double) -> Double {
        let area = width * height
        return area
}
    println(“320x480的長方形面積:\(rectangleArea(320,480))”)

使用外部參數名稱

我們在呼叫函式時經常會傳入多組的參數,但我們經常會忘了這些參數的功能和意義,如果我們在每個傳入的參數前能有個說明,那麼這個程式碼就更為清楚易懂;例如,上面的計算長方型面積函式rectangleArea,我們是這樣呼叫的:
        println(“320x480的長方形面積:\(rectangleArea(320,480))”)
    或許您猜得到320和480分別代表長與寬,但是卻無法確定那一個是長那個是寬,而且,如果未來傳入的參數愈多,我們就會愈難分辨每個參數的目的與用途,因此,建議您可以使用「外部參數名稱」,將每個參數賦予一個有意義的變數名稱。
例如,原先的函式是長這樣子:
    func rectangleArea(width:Double, height:Double) -> Double {
        let area = width * height
        return area
}
    weight與height都是內部函式,只能用在rectangleArea函式裏面,加入外部函式名稱後,函式的寫法變成如下:
    func rectangleArea(W width:Double, H height:Double) -> Double {
        let area = width * height
        return area
}
    呼叫此函式的時候,我們便可以加上變數名稱:
        println(“320x480的長方形面積:\(rectangleArea(W:320, H:480))”)

    這樣在使用函式時,是不是就很清楚了呢?
    不過,你可能會想到,可不可以內部與外部參數都使用相同的名稱height與weight比較方便呢?可以的,我們只要在變數前加上#符號即可,例如:
    func rectangleArea(# width:Double, #height:Double) -> Double {
        let area = width * height
        return area
}
呼叫函式的方法一樣,代入參數名稱即可:
println(“320x480的長方形面積:\(rectangleArea(weight:320, height:480))”)
  如此一來,我們便很容易看出函式中各個參數的功用和目的,雖然在撰寫時會多了些功夫,但是對後續的修改和維護卻方便了不少。

函式重載

函式重載是指多個相同名稱的函式但是接收的參數型別不同,例如,我們可以定義多組相同名稱的函式,分別接受不同類型的參數,舉例如下:
func receive(I : Int) {
    println( “接收一個Int型別的資料 i=\(i)” );
}
func receive(d : Double) {
    println( “接收一個Double型別的資料 d=\(d)” );
}
func receive(x :Int, y:Int) {
    println( “接收二個Int型別的資料 x=\(x) y=\(y)” );
}
func receive(i :Int) ->Int {
    println( “接收一個Int型別的資料 i=\(i), 回傳值型別是 Int” );
}
此時,假設我們執行a1:Int = receive(10),會呼叫最後一個函式,若執行a1:()= receive(10)或a1:Void= receive(10),則會呼叫第一個函式。那麼,a1()= receive(10, 10) 呢?應該是第三個。

函式回傳

        您看得出來下方函式的用法嗎?
        func getArea( type : String ) -> ( Double, Double ) -> Double {
            指令…
}
        我們要分段來看才能明白
函式名稱和參數是:func getArea( type : String )
    回傳的則是:( Double, Double ) -> Double
    代表了這個函式的回傳值是另一個函式的型式。
請參考下方的例子便更能明白函式回傳的用法(有點繁複):
    //函式:計算長方形面積
    func rectangleArea( width:Double, height:Double ) -> Double {
        let area = width * height
        return area
    }
    //函式:計算三角形面積
    func triangleArea( bottom:Double, height:Double ) -> Double {
        let area = 0.5 * bottom * height
        return area
    }
    //函式:判斷形狀並回傳面積計算公式
    func getArea( type : String ) -> ( Double, Double ) -> Double {
        var returnFunction( Double, Double ) -> Double   //先定義好要回傳的函式型別
        switch (type) {
            case “rect”:
                returnFunction = rectangleArea
            case “tria”:
                returnFunction = triangleArea
                default:
                    returnFunction = rectangleArea
                }
            return returnFunction
        }
    使用:
        var area : ( Double, Double ) = getArea( “tria” )
        println( “三角型面積:\(area(10,15))” )



註一:用HTML5或JavaScript等第三方程式撰寫後再Complier為原生碼,或在WebView模擬瀏覽器的環境下執行。
註二:Objective-C較慢的原因:其實Objective-C是在 C 上面架構了簡單的一層, Objective-C 語法會在 compile time 時編譯成 C,每個 Objective-C 物件其實都是一個指向某個 C structure 的指標,物件的成員就是 structure 中的變數,至於物件的 method 則是會編譯成 C function,然後 runtime 中會有一個表格,管理一個 C 字串對應到 function pointer 的對應,我們對某個物件呼叫某個 method 的時候,就是用 method 的名稱(又稱為 selector)去尋找對應的 function 執行。(摘自http://zonble.net/archives/2014_08/1616.php)

2015年1月22日 星期四

一場PHP與Node.js的聖戰



開發者該如何抉擇?
一場PHP與Node.js的聖戰

  這篇於1/12發表於www.infoworld.com 的專欄文章,作者是Peter Wayner,剛好我對PHP和JavaScript還挺有興趣的,因此看到這篇便分享給大家,文中作者用問與答的方式來回答PHP和Node.js在應用上的特點,不過最後他很聰明的不做出任何抉擇,由讀者自行來評判。
light saber duel fight
  尤如好萊塢常見的劇情:發生在兩個異途同歸老朋友之間的戰爭….他們的爭拗經常起因於無意間跨觸了另一位的敏感地帶,而現在程式語言的範疇也出現了類似這樣的劇情,往進者Node.js的出現,把PHP與Javascript這兩個曾經一起合作無間、獨霸網路世界的老友推到了相同的戰場,互相爭奪開發者的青睞。
    在以往,它們兩者之間的界限非常清楚,JavaScript居使用者端,安份的待在PC的瀏覽器上(我們稱為前端)展示著來自伺服器的資訊並接收使用者的輸入,而PHP盡責的在伺服器上處理來自HTTP(S)的資料並存取背後的資料庫(這部份我們稱為後端),長久以來這樣的分工模式一直完美的運作著,也成就了網際網路上WordPressDrupalFacebook這些為人稱頌的傳奇,若沒有Javascript+PHP,網路將不會是你我現在所看到的樣子。
    然而有一天,某些天才們突然發現了Javascript竟也可以運作在伺服器上,也就是網站或Web服務在後端用Javascript竟也能運作得很好,於是他們把這個執行在後端的Javascript稱作Node.js並且這個系統逐漸開始在業界流行起來,於是PHP頓時失去了網路霸主的光環,Javascript這個PHP曾經最要好的搭擋撈過界從前端跨足後端,把老友從寶座推落並且用自己的屁股坐上去,於是,「JavaScript everywhere」開始成了一些程式開發者最流行的口頭襌。
    當然,目前的劇情發展還尚未到結局部份,有些人稱頌Node.js的簡潔以及前後端統一的便利性,也有一些人極力維護有著豐富資源以及穩定廣泛使用的PHP,然而到底最終PHP會擊退莽撞的侵入者,還是JavaScript不顧老友情面一統前後端的世界呢?我們再繼續深究下去。

PHP贏面:混合的程式碼與頁面內容

  對於初學者來說,PHP是較具親和力的,無論何時,當你想在網站上放入內容或程式、添加子功能或函式、或者想要插入if-then語法讓網頁更加動人、甚至於在網址增加附帶參數、亦或增加一些字串到資料庫所傳回的內容,只要拿出神奇的PHP 標籤(<? 或<?php),不到數秒時間您就能在一張頁面上開始撰寫程式並完成需要的功能,用不到任何的樣本(Template),因為在PHP的世界裏每個檔案都可看成樣本,而且額外的檔案或架構宣告也等都不需要,只要你能用手指頭敲出PHP程式碼就行了。

Node.js贏面:著重程式碼與內容分離

    不過程式碼混雜HTML頁面的寫法最終可能會讓你陷入一團亂的地步,一開始這樣的直覺的混合寫法可能對於初學者有趣而且簡單,但很快你就會發現,這些大雜燴般的程式碼成了一團混亂難懂的邏輯,比較有經驗的程式設計師會採用更有架構性的方式把展示層與邏輯層分離,這樣展示與邏輯分離的概念,對於初接觸程式的新人來說其實會很容易理解,最重要的,維護前人留下的程式碼也容易得多了。因此你可以猜得到,最早的Node.js,就是由那些清楚MVC架構(ModelView, and Controller)的天才們所發明的。

PHP贏面:深厚的歷史資源

目前的網路世界充滿了PHP的痕跡,最受歡迎的建站軟體如WordPressDrupalJoomla都是用PHP寫的,而且不僅這些為數眾多的開源碼軟體,它們所有的附加功能和插件(Plug-in)也都是PHP,可以這樣說,PHP的程式碼到處都是,你隨時都找得到並下載所需要的功能和套件,而且也可以去修改它以符合你要的樣子。

Node.js贏面:新架構與新功能的支援

雖然目前有數不清開源的PHP程式碼可用,但是很多都是像WordPress這樣已經很多年歷史的老程式,且有很多plug-in也都已停止更新了,因此很多新進的年輕程式設計師並不屑學習這類要花時間在Copy/Paste程式碼方式架構網站的方法;而Node.js不僅夠新,而且是由那些懂得最新網站架構和功能的怪才們所開發,因此它與日新月異的使用者前端更相搭配。

PHP贏面:簡單

除了最後端的資料庫處理那段,要使用PHP並不難,只要瞭解一些變數用法和基本的函數就可以開始用PHP來操作字串和數字了,而這也是PHP的初衷:容易學習。此外,PHP需要搭配一個設計良好的資料庫,它分擔了部份loading讓PHP更顯得簡單,因此,PHP適用在那些不是非常複雜或高難度工作上。

Node.js贏面:複雜的「閉包」(closures)以及其它

JavaScript擁有很多特質讓它可以成就一些神奇、瘋狂的點子,事際上它是一個具有新式語法及架構(像是稱為closures這種奇特而難以理解的概念)的新程式語言,我們可以重新針對該語言作設定並延伸,製作出類似Jquery這樣powerful的程序庫,我們也可以把函數像是物件般的傳遞,在Node.js中,想像力是沒有限制的。

PHP贏面:不需要與前端互動

很多人認為前端瀏覽器和後端伺服器能使用相同的語言是相當不錯的事,但如果前端瀏覽器並不需要撰寫程式碼而僅僅是單純的HTML呢?因為純HTML不帶有任何程式碼的網頁在使用上更為廣泛,而且PHP在與純HTML頁面的搭配上更有優勢,所有的工作和資訊在Server端都處理完了才送出,我們也不用煩惱Javascript端的小問題和瀏覽器的loading。

Node.js贏面:精簡的伺服端呼叫

由於PHP要送出HTML碼並夾帶各式資訊,因此每次的呼叫都相當的肥大,而Node.js則精簡且效率,如果JavaScript程式碼已經存在於瀏覽器的快取當中,那麼兩者之間傳送的更只有update資料部份,Node.js不會傳送大量的HTML標簽,也不會重複的遞送整頁的資訊,除非資料有所改變,因此,Node.js相當適合應用在建置各式的Web 服務(Web services),如果你的程式相當複雜而且有著大量的資訊,那麼用Node.js來替你的網站建置Web services相當適合。

PHP贏面:SQL

如果說PHP和Javascript是好朋友,那麼mySQL可說是它的孿生兄弟了,PHP有很多的特性就是為了mySQL和與它類似的SQL資料庫而生,例如MariaDB、Oracle、MSSQL等,在PHP要轉換資料庫很容易,只要在連結資料庫的程式碼修改一下就行了。

Node.js贏面:JSON

如果你一定要使用SQL,Node.js也有函式庫可以支援,但是Node.js與JSON這類的NoSQL資料庫搭配會更適合,雖然目前PHP也有支援JSON,但是JavaScript與JSON搭配使用更具效率與簡捷,冒號及大括號所構成的JSON格式從前端瀏覽器到後端伺服器以及更後端的資料庫都能處理並解譯, 它不像複雜龐大的SQL讓人感到挫折與頭疼。

PHP贏面:程式撰寫的速度

對大部份的開發者來說,感覺用PHP撰寫程式比較快速,因為不需要complier,不需要佈署,不需要jar檔或預處理,只需要一個常用的文字編輯器然後把寫好的PHP檔放在同個目錄下就可以了,當你有急迫的專案需要完成,PHP可以快速的幫你達成。

Node.js贏面:執行速度

寫JavaScript比PHP有更多的大小括號要注意,但如果處理得完美,它可以讓你的Node.js執行得更快速,而且特有的callback機制(當一個函式執行完畢後所執行的那個函式就是所謂的callback)更讓你不會在一團混亂的threads當中迷失。

2015年1月7日 星期三

TRIZ系統性創新(二)

還記得上一篇「TRIZ系統性創新(一)」中提到的TRIZ Contradiction Matrix嗎?這個中文稱之為矛盾矩陣的對應表是TRIZ的精華部份,它的作法是將欲解決的問題拆解為兩組系統矛盾參數,再藉由此兩組參數所對應到的發明原理來思考出可能解決方案,因此,透過TRIZ的矛盾矩陣,我們對於問題的思考會被拆解成如下A~D的四個步驟:
將問題轉換為這樣的思考方式之後,我們會發現困難的地方其實在於A與D這兩個步驟,其它B與C都是制式的作業並不成問題;A步驟的困難在於:要如何將現實的拆解為衝突參數並從39個TRIZ矛盾參數中歸納得到兩組我們需要的矛盾參數,而D步驟的困難則在於,要如何充份理解四十組TRIZ發明原理,並針對上步驟的衝突矩陣而得到的發明原理,如何透過腦力激盪的方式得到具創新的解決問題的方法。
在本文中我先介紹A步驟的39個TRIZ矛盾參數,在下一篇文章中再介紹D步驟的四十組TRIZ發明原理。這些矛盾參數的內容說明是參考自蕭詠今所翻譯的「TRIZ創新的科技」一書,原作者為Isak Bukhman。http://122.146.57.161/Assets/product_images/986/986856351.jpg


系統矛盾參數

我們人的一生充滿了種種的矛盾與衝突,也可以這麼說,我們所過的日子是由矛盾與衝突組合而成的,想想看,每天在床上睜開眼就開始面臨了矛盾衝突的抉擇:該起床或繼續睡?今天要穿那種款式的衣服?要打什麼顏色的領帶?更遑論接下來的時間裏會有更多更複雜的狀況要處理,因此,我們的日常生活就是由各種矛盾所組合的情況,同樣的,經由人類所創造出的各種系統包含產品、製程與服務等等,在它們被使用的過程中,也會面臨種種的矛盾與衝突,Altshuller將這些成千上萬的矛盾衝突歸納匯總並萃取成為39個參數,它們在TRIZ系統中稱為系統矛盾。
在列示所有的矛盾參數之前,或許我們先來看看幾個案例,這樣我們更能對後續在介紹39個參數時更能掌握其使用方法。
案例#1
系統矛盾:我們知道,愈長的巴士可以搭載更多的乘客,但是操控性會變差,比如轉彎時要更加注意。
衝突參數:巴士的長度 vs. 巴士的可操控性
案例#2
系統矛盾:學校的書包應該有很大的容量可以攜帶很多書、筆記本等等,但是愈大的容量會使得書包更重,對學生而言使用起來會很辛苦。
衝突參數:書包容量 vs. 書包重量
案例#3
系統矛盾:想要少飛機跑道長度,但是跑道長度若過短,若缺乏更強大的引擎動力會使得滑行時機翼的氣流不夠無法帶動飛機起飛。
衝突參數:這個例子包含了數個相互衝突的參數
  1. 飛機速度 vs. 引擎推力
  2. 引擎推力vs. 引擎體積重量
  3. 飛機速度 vs. 燃料消耗
  4. 飛機速度 vs. 引擎推力
  5. 飛機速度 vs. 引擎推力
  6. 引擎推力vs. 燃料消耗

39個系統矛盾參數的定義

接下來我們來瞭解這39個系統矛盾參數的內容,事先熟悉這些系統矛盾對於我們在針對問題作解析時大有幫助;請注意,下列參數中所謂的「移動物體(Moving Object)」指的是會改變位置的物體,而「靜止物體(Stationary Object)」指的是不會移動的物體。
  1. 移動物體的重量(Weight of moving object)
  2. 靜止物體的重量(Weight of stationary object)
  3. 移動物體的長度(Length of moving object)
  4. 靜止物體的長度(Length of stationary object)
  5. 移動物體的面積(Area of moving object)
    翻譯問題,在拆解問題時我們不需要執著於是否為「面積」數字,而是「面」的形體,指的是該物體的表面。
  6. 靜止物體的面積(Area of stationary object)
    同上。
  7. 移動物體的體積(Volume of moving object)
    同5,在拆解問題時我們不需要執著於是否為「體積」的量化,有時是一種佔據多少空間的三維概念。
  8. 靜止物體的體積(Volume of stationary object)
    同上。
  9. 速度/速率(Speed)
    速度是指物體運動的快慢,或位置改變的程度,通常以每單位時間t移動的距離為d來表示,此外,每秒鐘動多少次也可稱為速度。
    速率是一種純量(Scalar),所用的單位為距離/時間;相對於速率而言,速度是一個向量,兩者的純量相同,但速率不包含物體移動的方向,因此速率是速度的一個要素。
    在拆解問題時,有時我們也可以將速度認知為一個過程或行動時間的快慢。
  10. 力(Force)
    力是系統之間相互作用的度量;力有大小和方向,所以力是一個向量。
  11. 應力或壓力(Stress or pressure)
    應力是對應於作用力或作用力系統的內部阻力(反作用力),它往往會造成物體的變形。
    壓力是一個物體與另一個物體的接觸時作用在物體表面的一種力量,以單位面積的力為度量單位。
    我們要注意,應力會產生壓力或造成物體變形。
  12. 形狀(Shape)
    一個外部輪廓、系統的外觀。
  13. 物體組成成份的穩定度(Stability of object’s composition)
    物體組成是構成「物體結構」的真正元素組合,而「物體組成的穩定度」是指,在我們感興趣的這段時間內物體的真正元素組合。
  14. 強度(Strength)
    我們可理解「強度」為:
    1) 一種抵抗斷裂的阻力
    2) 一種物體強固的狀態、性質和品質
    3) 抵抗應變或者物體本身應變的力量。
  15. 移動物體的耐久度(Duration of action of moving object)
    我們可將耐久度理解為:物體運作的時間或使用壽命。
  16. 靜止物體的耐久度(Duration of action of stationary object)
    同上。
  17. 溫度(Temperature)
    溫度是一種能量,可能以許多形式來出現,例如熱能、色溫。
  18. 亮度(Illumination intensity)
  19. 移動物體所需的能量(Use of energy by moving object)
    在此可理解為一種作工時所消耗或需要的能量。
  20. 靜止物體所需的能量(Use of energy by stationary object)
    同上。
  21. 功率(Power)
    功率指的是作功的速率。
  22. 能量的損耗(Loss of energy)
    能量轉變成不同形態所造成的損耗。
  23. 物質的損耗(Loss of substance)
    系統材料、物質、元件或子系統的損耗。
  24. 資訊的遺失(Loss of information)
    資料的損失、無法獲得系統的資料、或是人的五官(觸覺、味覺、嗅覺、視覺、聽覺)無法感受到資料。
  25. 時間的浪費(Loss of time)
    我們可體會為「目前所用時間」與「可能的更短時間」的差距。
  26. 物質的數量(Amount/Quantity of substance)
    物質的數量就是指物質的多少(或數量),也可能指的是子系統或系統元件的數目。
  27. 可靠度(Reliability)
    指的是在日常、惡劣或意外的情況下,系統執行功能的能力。
  28. 量測精準度(Accuracy of Measurement)
    指的是測量值與實際值接近的程度。
  29. 製造精密度(Precision/Accuracy of Manufacturing)
    指的是製造的精度/準確度,一種實際的系統參數與規定參數匹配的程度。
    另外要注意的是,準確度指的是與目標的差距,而精度指的是變化的程度。
  30. 會影響系統的有害因素(Harmful factors acting on object from outside)
    指外部事件所導致系統中一些有用的特性惡化。
  31. 系統產生副作用(Harmful factors developed by object)
    物體或系統本身所產生的作用,對於外部環境造成有害影響。
  32. 容易製造(Manufacturability)
    該物體或系統的可製造性,重點在於製程能力、機器或設施的彈性,以及控制在要求的生產品質或成本下的生產能力。
  33. 容易操作使用(Usability)
    指的是物品或系統的可用性,即容易使用的程度。
  34. 容易維修(Reparability)
  35. 適應度(Adaptability)
    能夠改變(或被改變)的能力,以適應不同的需求與環境;若該系統具有強適應性,便可適用於不同的情況與提供更多的使用方式。
  36. 系統複雜度(Complexity of device)
    指比其它同類產品更難以創造或製造。
  37. 控制的複雜度(Complexity of control and measuring)
    對於量測某一個給定的參數值,所需要的量測元件數量和困難性與會與量測控制時間成正比。
  38. 自動化程度(Level/Extent of automation)
    指的是取代人工作業的程度。
  39. 生產力(Productivity)
    指的是輸入/投入與產出的關係。

練習:系統矛盾參數的腦力激盪

下方我們以貨車為例,從系統分析開始到定義系統矛盾,我們分成四個步驟來練習:
步驟一:產生貨車的系統參數列表
  1. 速度
  2. 燃油消耗
  3. 空氣阻力摩擦
  4. 貨物重量
  5. 引擎功率
  6. 安全
步驟二:選擇一個您有興趣的參數並改變它的值,例如:速度↑。
步驟三:分析這個參數和步驟一中的參數列表的交互作用影響。
例如:速度↑會造成X↓此行我們稱為「衝突對」,每一個「衝突對」就是一個系統矛盾。
        速度↑    ←→     燃料消耗↑        ➔衝突(系統矛盾)
        速度↑    ←→     空氣阻力摩擦↑    ➔衝突(系統矛盾)
        速度↑    ←→     可載貨物重量↓    ➔衝突(系統矛盾)
        速度↑    ←→     發動機功率↑        ➔衝突(系統矛盾)
        速度↑    ←→     安全性↓            ➔衝突(系統矛盾)
步驟四:從前述的39個矛盾參數中,選擇最合適的參數來代表,在選擇時要有彈性,如果無法直接找到所需要的參數,那麼就提高抽象的程度。
    我們從矛盾參數中,找到第九項(Speed)代表本例中的速度:
速度(9)↑    ←→     燃料消耗(19使用能源的運動物體)↑
速度(9)↑    ←→     空氣阻力摩擦(11應力或壓力)↑
速度(9)↑    ←→     發動機功率(21功率)↑
速度(9)↑    ←→     安全性(27可靠性)↓

  上述步驟四,代表我們已完成了矛盾參數的分析工作,這部份需要先對問題本身以及產品及系統有深入的瞭解,才能正確的解析出最合適的矛盾參數。