發表文章

目前顯示的是 2019的文章

Design Pattern_Skill_4_簡單工廠模式(Simple Factory Pattern)

圖片
在軟體系統設計當中 創建型模式:主要是針對處理物件創建相關情況以某種方式控制物件實體化的設計模式 試圖就實際情況來切換較合適方法進行創建物件 主要核心思想是 將系統使用到的具體Class封裝起來 隱藏具體Class Object的建立與結合 創建型模式: (1)物件創建型模式:將物件實體化過程部分移至另一個物件中 (2)類別創建型模式:將其物件實體化過程移置子類中 在設計過程中時常會提到要對抽象(介面或抽象類)進行程式編碼設計 而不是對具體(實際物件)進行程式編碼設計 舉例要做一個比薩 就建立一個Pizza Class 做一個麵包則建立一個 Bread Class 一直透過new來實體化物件 這是典型的一個針對具體的設計 隨著時間流逝系統程式碼量倍增情況也影響到後期維護的複雜及工作量 不管後續要做捨麼都要創建新類別實在很麻煩 此時我們想到一種方法 有沒有可能我們設計一種Class是專門負責創建物件的 就好像一座工廠要做pizza或麵包 我們只要去調用該Factory class某一個方法透過傳指定參數來實作並回傳特定物件 此模式就是所謂的「簡單工廠設計模式」 ============================================================== 一家剛起步不久的Pizza店中的程式人員 負責幫忙開發pizza的系統 首先它知道pizza有如下工序 備料(準備起司絲、肉片)、 製作(稈麵團、加入蠔油)、 烘烤(統一30分鐘)、 完成(用紙箱裝盒外帶) 之後還有下訂單等業務 一開始推出口味有起司火腿、德國香腸、原味火腿口味的 所以他就直接寫了負責Pizza專屬工序的Class 對應三種不同口味的Class 還有負責訂單的Class 負責Pizza專屬工序的Class package OrignalApp ; /** * * @author chous */ public class Pizza { public void prepare (){ System . out . println ( "備料:準備起司絲、肉片" ); } public void make (){

Qt教材筆記_part01_基礎控制項_Buttons_slot信號槽範例(拖動、打程式添加)

圖片
Qt專案新建方式 第一種Qt Widget QPushButton使用(搭配QMessageBox) drag一個Push Button 可用變更文字來更改顯示文字為Test或其他內容 針對其右鍵則可添加信號槽進行event註冊 ui->setupUi(this)是由.ui文件生成的類的構造函數,這個函數的作用是對界面進行初始化,它按照我們在Qt設計器裡設計的樣子把窗體畫出來,把我們在Qt設計器裡面定義的信號和槽建立起來。 這邊要注意一定要放在最上面不可以把ui->setupUi(this)這行代碼寫在了最後底部。 不然會出現提示內存洩漏問題。 Qt在ui->setupUi(this)中對控制項進行內存分配 只有分配了內存,才能使用諸多控制項,所以說一定要把ui->setupUi(this)這行代碼放在函數一開始的位置。 Ctrl+A 再 Ctrl+i可自動format好程式碼喔!! 再使用QDebug時候記得引入相應header喔 另外內建的Qt header可用雙引或是尖括號(推薦) 透過按鈕來更新Label 完整範例程式碼 mainwindow.h(QPushButton+QLabel+QMessageBox) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow ; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_pushButton_clicked(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H mainwin

Delphi (1)_Δελφοί太陽神住的地方_IDE基礎操作_程式檔案架構

圖片
Delphi,是Windows平台下Object Pascal語言整合式開發環境 Delphi讀音Δελφοί 源自於希臘文戴爾法 意思是希臘的 太陽神居住的地方 http://blog.udn.com/kocj/2109442 後來大部分用英文來讀了 最初版是由美國Borland公司於1995年(剛好我出生那年推出跟我一樣大了) 開發出來的程式語言 主要是為了替代DOS時期的Turbo Pascal 而推出的可視化程式開發產品,目前推出版本有 1.0  / 2.0 / 3.0 / 4.0 / 5.0 / 6.0 / 7.0 / 8.0 在當時古早時代主打代碼自動生成及豐富數據管理工具 Delphi特點: 1.為32位元應用程式,早期多半運行於WindowsXP系統/Windows 95/98/2000/Windows NT。 2.Delphi的編譯工具在那時號稱最快32位元程式編譯器 使用此編譯器生成的EXE執行檔各自獨立的,對於動態連結執行時解析DLL可彈性調整。 3.根據Object Pascal語言的物件導向開發程式工具。 Pascal語言開發工具長相(1983年推出) Pascal語言由瑞士蘇梨士理工學院 尼古拉斯-沃斯先生在1971年設計的for教學嚴謹用途 http://progopedia.com/version/turbo-pascal-7.0/ 我們先認識一點Pascal程式語法(暖身一下) 在Delphi IDE當中呢... 我們是可以去新建一個Console Application專案 (for Pascal你可以寫一些基礎語法) 這裡選Console Application專案 預設會生成一個Pascal程式架構的檔案(副檔名.dpr ->Delphi Project檔案縮寫) 以下是小暖身(如何輸入/輸出/迴圈/判斷/變數宣告...) Delphi程式主體架構 一個乾淨的程式區塊(在此皆為預設系統自動生成的沒把握建議不要隨意去更動以免報錯) 此時的Form長相 視窗應用專案新建方式 Console應用程式專案新建方式(在Delphi中稱作Unit) 一個Object Pa

EIT造型技術思維(一)_繼承??抽象??_基底(父)類別並非抽象出來的

圖片
在 作者Fred Brooks所撰寫的 The Mythical Man-Month一書中 曾有提及到 "The complexity of software is an essential property, not an accidental one." 軟體複雜是與生俱來的性質 因此程式人員通常會希望愈簡單愈好 化繁為簡 通常面對複雜情況會傾向找到簡單或是邏輯一致的規則 才不會害怕 到底怎麼從複雜轉化成簡單? 通常會去關注變化和差異 將差異去除提取抽象的共同結構(留下萬變不離其宗的共通性過程就稱為抽象) 比方說: 三角形、正方形、長方形在這些具象中觀察變化 變化上就是面積、邊長、等等 那我們會提取出形狀的一個抽象結構 (從本質上來看這些都是形狀,形狀通常都會有面積、內角和等等屬性) 這是以往的思維但也就涉及到你必須找到 所有的具象,這就會導致不敏捷,因為需要找很久。 這裡舉生活化一點的例子 假設今天你面對的具象是 茶葉、水果、咖啡豆 請進行抽象 這時你會開始苦惱不像剛剛的形狀這麼理想這麼容易找到共通點 信用卡 MasterCard、Visa、........一堆具象要找到所有實在太耗時此外一些不同銀行變化 規則更複雜 或者抓一堆貓 每隻鬍鬚都不同這時你把鬍鬚去除 每隻尾巴也都不同乾脆也去除 .....其他又有不同的比如眼睛、鼻子、..... 因此我們得到 一個沒有尾巴、沒有鬍鬚、沒有眼睛、嘴巴的這個叫貓 確實得到簡單(不變的部分)但也傷害到其完整性 因此若要敏捷就不能在尋找不變!!!!!! 杯子並非從果汁、咖啡當中抽想出來的,但不論果汁跟咖啡都能裝進去 皮包也不是從一堆生活物品中抽象出來的不變部分 Essence 簡單一詞其實於東西方認知是有差異的 西方人認為簡單一詞是指 不可或缺的 東方人則認為是永恆不變的本質或真理 一隻貓就必須要有尾巴、鬍鬚所以不能去除 那要如何達到簡單呢?? 你不用刪除也不需要去剖析差異直接把一整隻貓裝進皮帶中 過去我們追求不變,追求不變作法則是將變化刪除,而非有效掌握變化。 上述提到的東西方觀點 其實只是不同視角、思維(一體兩面) 任何視角本身無對錯、更多視角才能讓設計更可靠。 比

Redis開發學習(4)_StackExchange.Redis_進行String相關操作

圖片
在一些資料整理上有提到雖然目前針對.NET 釋出相關Redis Client API  不只一個StackExchanged.Redis 但是ServiceStack是要付費的!!!!!!! 而且在舊新版本的切換上據說語法也會有不相容的問題 (1)資料塞入指令 寫法1.透過StringSet 1 IDatabaseObject.StringSet( "Key" , "value" ); 寫法2.透過Execute方式 1 IDatabaseObject.Execute( "SET" , "Key" , "Value" ); 程式碼 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using StackExchange.Redis; namespace RedisProject1 { class Program { static void Main( string [] args) { Console.WriteLine( "啟動資料庫連線" ); ConnectionMultiplexer myConn = ConnectionMultiplexer.Connect( "localhost:6379" ); var myEndpoints = myConn.GetEndPoints();