Ci Ty Chen

@CityChen

Joined on Jun 20, 2019

  • 下载 .NET 下载 .NET 版本 版本整理圖表 C#版本 釋出時間 .NET 版本 VS版本 C#1.0
     Like 1 Bookmark
  • murmur Teddy 的這堂課真的很不便宜...但有這個價值. 上完後, 感覺會飛喔 XD 有閒錢的話, 可以去上一下. 領域驅動設計與簡潔架構入門實作班 Domain Driven Design 定義 何謂 Domain ? 應用程式邏輯所圍繞的知識和活動範圍 ---- 特定知識或專業為基礎的範圍翻譯成白話文就是 在真實世界中, 你的軟體所要解決的問題範圍 例如 : 電子商務、醫療系統、保險系統、銀行系統、叫車系統、定位系統 等等
     Like  Bookmark
  • 前言 UnitTesting Why We Should Test Code ? Reduce Bugs Reduce Costs Improve Design當你發現測試很難寫時, 需要開始擔心架構設計上是否有問題. Documentation
     Like 2 Bookmark
  • Clean Coding Principles in C# 課程連結 Why Writing Clean Code Matters 前言 Programmer is the are of telling another human what one wants computer to do --- By Donald Knuth Any fool can write code that a computer can understand. Good programmer writes code that human can understand 我們都可以輕易寫出執行邏輯符合期望表現的程式, 但這只是基本, 如果我們要自稱為程式設計師 , 那麼我們應該試圖寫出他人可以輕易看得懂的程式碼.
     Like 1 Bookmark
  • 抽象化 抽象化(英語:Abstraction)是指以縮減一個概念或是一個現象的資訊含量來將其廣義化(Generalization)的過程,主要是為了只保存和一特定目的有關的資訊。例如,將一個皮製的足球抽象化成一個球,只保留一般球的屬性和行為等資訊。相似地,亦可以將快樂抽象化成一種情緒,以減少其在情緒中所含的資訊量。 Abstraction describe what e.g. Send a Message Store a Customer record Details specify how
     Like 4 Bookmark
  • What We Should Defend From ? Define Defensive Coding Defensive coding is an approach to improve software and source code, in terms of: General quality - reducing the number of software bugs and problems Making the source code comprehensible - the source code should be readable and understandable, so it is approved in a code audit. Making the software behave in a predicatable manner despite unexpected inputs or user actions.
     Like  Bookmark
  • Mur Mur 這個課程的講者好囉嗦. 連基礎語法都要介紹= = 前言 OOP 的概念是一切的基礎 我們都希望寫出高品質易測試且未來不容易出錯的程式碼. 但這個目標應該如何達成呢 !?
     Like  Bookmark
  • 前言 當你只想改變或擴充演算法的某幾個步驟時 , 可以考慮用 Template Method Pattern 當你有複數個類別有幾乎一樣的演算法時 (重複的程式碼), 可以考慮用 Template Method Pattern 抽取相同的演算法到父類別, 而不同的部分則留給子類別擴充. 問題需求 有一家咖啡店希望請你撰寫自動泡咖啡的程式. 所以你先定義了一個咖啡類別, 此類別負責控制機器沖泡咖啡. 但有一個令你很苦惱的事情是咖啡店提供的咖啡不只一種品牌, 而每種咖啡品牌在一些步驟上有若干微小的差異. 像是水/牛奶/咖啡的比例不一樣等等.// First Version public abstract class 咖啡
     Like  Bookmark
  • 前言 當有複數個物件需要依據另外一個物件的狀態變化(相同的資料)執行對應的動作時, 就可以考慮使用觀察者模式 別稱 Publish-Subscribe Pattern 問題需求 你需要設計一套軟體版本自動升級工具. 在區域網路內只能有一台電腦(命名為 Server)可以聯外網, 其他電腦(命名為 Client) 會透過 Server 得知是否有新的軟體版本可以升級. --- 通常是工廠環境, 為了安全等因素, 所以只允許一台設備對外. 為了解決這個問題 , 可能有兩種思路.
     Like  Bookmark
  • 前言 你希望某個類別最多僅能存在一個物件實體 --- 通常是此類別控制了某個共享資源(E.g. File, 連線, DB 等等), 此時可以考慮使用 Singleton Pattern. 你希望對於全域變數的存取是經過限制或是控制的, 此時可以考慮使用 Singleton Pattern. 問題需求 你的程式需要存取 DB, 你寫了一個類別專門用來快取 DB 的資料 (e.g. Entity Framework 的 DbContext. 從 DB 預先讀資料到 Memory 中, 使用者操作此物件的資料, 等同於操作 DB 的資料). 此時 你希望這個類別只能有一個物件實體 ---> 因為多個實體代表會讀多次 DB 的資料到 Memory. 增加 Memory 使用量. 而且多個物件實體, 也讓你也不好管理 DB 資料的狀態. (E.g. 哪個物件的資料應該寫入 DB)
     Like  Bookmark
  • 前言 當你想使用某些現有類別, 但它的接口與你的客戶端程式碼不兼容, 此時可考慮使用 Adapter Pattern. 某些現有類別缺乏一些常見的功能, 此時可考慮使用 Adapter Pattern 去擴充這些類別. 兩個以上不同介面的類別所做的事情, 概念上是類似的, 此時若統一介面可以讓客戶端程式使用上更簡潔, 也可以考慮使用 Adapter Pattern. 問題需求 假設現有機器會定期產生 XML 格式的資料, 然後我們希望將這些資料轉換為圖表輸出在網頁上. 所以我們找了一套繪圖用的 Nuget 套件. 但是這個套件只能接受 JSON 格式的資料...
     Like  Bookmark
  • 前言 比較古老的 pattern , 所以之後的 patten 幾乎都會使用到橋接模式的技巧. 如果你想要重構某個複雜的類別, 想將其功能實作抽離到其他類別去, 此時可參考橋接模式. 你希望未來類別擴充的因素是彼此不影響的(不會有相乘的狀況發生), 意即擴充某個因素的項目時, 不會影響到其他因素的類別層次. 此時可參考橋接模式. 問題需求 假設我們今天想要設計一個手機硬體程式, 且這個手機硬體程式支援後續各個廠牌的擴充. 那麼依據物件導向的概念 , 我們可能會將手機共通的功能抽象化到到介面或是抽象類別. 然後替各自品牌的手機實作屬於他們自己的功能, 如下圖. graph TD;
     Like  Bookmark
  • 前言 在程式中 , 我們時常使用集合去儲存複數的元素(資料) --- 集合只是儲存複數資料的容器. 依據集合型態的不同 , 我們可能有不同的走訪/存取方式 現行常見的集合型態 Array / List / Stack / Queue 等等 Iterator Pattern 通常早就被內化到現流行的程式語言中了 問題需求 假設我們需要操作類似 Tree 結構這種複雜的資料. 我們可能會使用 List 去儲存. 再寫一個方法去走訪這個 List. 此時會發現若不使用 Iterator Pattern , 我們可能只能將 HighModuleA 的 IteratorByDFS 複製後 , 貼到 HighModuleB 去. 而這是不推薦的作法...
     Like  Bookmark
  • 前言 當原本的介面太難用了, 我們可以重新定義一個介面, 供外部使用 Facade 滿足最小知識原則. Facade 的重點在 "提供一個簡單易使用的公開接口介面" 問題需求 假設現實生活中, 你需要實作一個按鈕讓使用者(們)可以透過微波爐微波食物. 此時你可能需要使用到三個模組的部分功能, 並且依照正確的順序使用它們, 否則微波爐會爆炸XD 啟動電源(電源供應模組)
     Like  Bookmark
  • 軟體設計 定義 The final goal of any engineering activity is the some type of documentation. When a design effort is complete, the design documentation is turned over to the manufacturing team. This is a completely different group with completely different skills from the design team. If the design documents truly represent a complete design, the manufacturing team can proceed to build the product. In fact, they can proceed to build lots of the product, all without any further intervention of the designers. After reviewing the software development life cycle as I understood it, I concluded that the only software documentation that actually seems to satisfy the criteria of an engineering design is the source code listings. 約三十年前以工廠為導向的思考方式會認為軟體設計的產出物是 UML 圖 老闆覺得只要將 UML 圖給工程師 , 就可以讓工程師照圖施工 , 複製出產品. 現在的思維則是認為軟體設計的產出是程式碼 (Source Code)
     Like 2 Bookmark
  • 閒話543 C#的語法糖真的是多到一個爆炸呀:laughing: Iterators & yield yield 在 .Net 2.0 時提供 當編譯器偵測到迭代器時,它會自動產生IEnumerator 或 IEnumerator 介面的 Current、MoveNext 和 Dispose 方法。 迭代器方法使用 yield return 陳述式,一次傳回一個項目。 當到達 yield return 陳述式時,系統會記住程式碼中的目前位置。下次呼叫迭代器函式時,便會從這個位置重新開始執行。
     Like  Bookmark
  • 閒話543 最近開始寫 LinQ 的筆記後才發現 LinQ 與 foreach 在設計模式的實作上 , 原來都有採用 Iterator (疊代器模式) 呀 , 忘記在哪本書裡面看到的 , 它說 : Iterator 由於幾乎被大多數程式語言內化 , 固此模式的學習價值遠高於實戰價值 , Gof 甚至曾經提出要刪除此模式... 定義 提供一種方法可以讓使用者能夠走訪集合對象中的各個元素 , 但又不必暴露該對象的內部實現. 單一設計原則(SRP) - 一個類別最好只負責一個責任 , 只有一個修改它的原因. 我們固然能夠在集合對象中實作走訪的操作 , 但這樣集合對象可能就承擔過多的責任(?). 也就違反設計模式中的單一設計原則(SRP) , 因此我們要盡可能的分離職責 , 讓不同的類別承擔不同的責任. 而 Iterator 模式在 foreach 實作上 , 簡單來說 , 就是將走訪這個動作抽離出來給另一個類別負責.
     Like  Bookmark
  • Aggregate An aggregation operation computes a single value from a collection of values. Aggregate 的意思是加總的、聚合的. 也就是說 Aggregate 會將集合元素透過若干處理合併為一個結果 , 並回傳. Aggregate 方法會走訪每一個元素. 在每次元素拜訪結束後 , 會將計算結果暫存起來 , 用作與下一個 Current Item 進行結合、處理或是使用者指定的運算. 這意思是說前一篇介紹的 Sum、Average、Count、Min 以及 Max 其實都只是 Aggregate 的一種特殊情況之一. 以 Sum 為例 : 使用者透過傳入委派指定加法作為合併手段 , 因此 Aggregate 會走訪每一個元素 , 將當前拜訪的元素與上次的暫存結果加總起來 , 做為下一次的暫存結果. 其他的方法則以此類推.
     Like 1 Bookmark
  • Count、Sum、Average、Min、Max 是 LinQ 內用來進行統計運算(?)的函數. 其與 First 相同 , 都是立即執行(Immediately execution)查詢. 因此不用擔心延遲執行的問題. 另外需要特別注意的是上述函數的回傳值只可能是 Value Type 以及 Nullable Type . 也就是說 , 像是回傳學生集合中成績最小的學生物件 , 這個動作是無法達成的. Min 回傳序列中指定項目的最小值. 常用的多載形式如下(不只) TSource Min(this IEnumerable) Returns the minimum value in a generic sequence.
     Like  Bookmark
  • 前言 LinQ 與排序有關的方法一共有四個方法 , 分別是 OrderBy , ThenBy , OrderByDescending 以及 ThenByDescending. 透過 OrderBY 或是 OrderByDescending 創造實作 IOrderedEnumerable 類別 , 由此類別負責資料的排序. 之後的 ThenBy/ThenByDescending 則是修改此類別在排序上的方式(比較大小的方式). 是一個很漂亮的 Flutter 設計. 正常人大概會用建造者模式去實作 OrderBy 吧XD. 總之排序章節預計用兩篇的幅度來介紹 , 第一篇用來介紹如何使用 , 第二篇才來探討其方法實作的細節. 排序資料 (C#) 排序會根據一個或多個屬性來排序序列的項目。 第一個排序方式會執行元素的主要排序; 您可以藉由指定第二個排序方式來繼續排序每一個主要排序群組內的元素. 下圖顯示對一系列字元執行字母順序排序作業的結果: // 程式碼範例 char[] Source = new char[] { 'G', 'C', 'F', 'E', 'B', 'A', 'D' };
     Like  Bookmark