2020年12月30日 星期三

C# 物件的複製

 C# 物件的複製

  • Shallow Copy - 使用 MemberwiseClone():

public Person ShallowCopy()
{
return this.MemberwiseClone() as Person;
}
  1. If a field is a value type, a bit-by-bit copy of the field is performed
  2. If a field is a reference type, the reference is copied but the referred object is not


  • Deep Clone - 使用 BinaryFormatter() 序列化(Serialize) 
        public Person DeepClone()
{
using (var memory = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(memory, this);
memory.Seek(0, SeekOrigin.Begin); // Set the position to the beginning of the stream.
return formatter.Deserialize(memory) as Person;
}
}


reference: https://dotblogs.com.tw/yc421206/2012/05/25/72390

2017年8月15日 星期二

Set PowerShell Execution Policy

透過 C# 執行某個 *.psl 時,有時候會遇到下列錯誤訊息:
"*.psl cannot be loaded because the execution of scripts is disabled on this system"
此時, 必須 set execution policy to unregistered, 如下:
"Set-ExecutionPolicy Unrestricted"


使用C# code設定 Execution Policy:
** PowerShell 有2 個版本 (x64 與 x86)。
1). 當C# 應用程式為64-bit時,這裡的Set Execution Policy 會設定到 PowerShell x64
2). 當C# 應用程式為32-bit時,這裡的Set Execution Policy 會設定到 PowerShell x86

** 設定完ExecutionPolicy 之後, 可以在Windows Registry看到:
1). (PowerShell x64)
HKEY_Local_Machine\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.Powershell\ExecutionPolicy 為 unrestricted
2).(PowerShell x86)  HKEY_Local_Machine\SOFTWARE\Wow6432Node\Microsoft\PowerShell\1\ShellIds\Microsoft.Powershell\ExecutionPolicy  為 unrestricted



Reference:
1). Set-Execution Policy from process <Link>
2). Powershell Get-ExecutionPolicy returns different values <Link>

2017年7月26日 星期三

HTTP v.s. SOAP

HTTP 可以提供各種服務 - HTML, images, sound, video, etc.
SOAP 是在 HTTP 上面, 專門提供 XML 傳送的服務.

SOAP 的request 如下,HTTP headers在上面, SOAP message 在下面:

---------  HTTP portion of the message ------
POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn

---------  SOAP portion of the message ------
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Body xmlns:m="http://www.example.org/stock">
  <m:GetStockPrice>
    <m:StockName>IBM</m:StockName>
  </m:GetStockPrice>
</soap:Body>

</soap:Envelope>

reference:
Difference between SOAP and HTTP protocol <Link>

2017年7月20日 星期四

HTTP Request methods - Get and Post methods

HTTP Request methods 有下列8種方法:

  1. GET
  2. POST
  3. OPTIONS
  4. HEAD
  5. PUT
  6. DELETE
  7. TRACE
  8. CONNECT
先介紹最常用的 GET 與 POST 方法:

  1. GET:取得我們想要的資料。把查詢資訊放在URI上, 「取得」想要的資訊。 
    • Ex: http://xxx.toright.com/?id=010101
  2. POST:新增一項資料(不會覆蓋舊資料)。要求Server接受的資訊是附在請求本體(Body), 而不是在URI上

Reference:
  1. 常見的HTTP METHOD的不同性質分析 <Link>
  2. 重新認識HTTP請求方法 <Link>
  3. 淺談 HTTP Method:表單中的 GET 與 POST 有什麼差別 <Link>

2017年7月3日 星期一

OOD 原則 - SOLID

OOD 原則 - SOLID

物件導向設計 5 大原則:
1. (SRP) 單一職責:
    一個類別只負責一件事情

2. (OCP) 開放/封閉原則:
    開放擴充, 關閉修改

3. (LSP) Liskov替換:
    子類別應該可以替換掉父類別而不會影響程式架構
    子類別可以擴充父類別的功能, 但不能改變父類別原有的功能。子類別不要覆蓋父類別的方法!
    -->設計上應該少用繼承, 多用composite/aggregation 達到re-use目的 (i.e., 做一個wrapper 包住 base class)
    --> CARD - 先思考 Composition/Aggregation 的 Reuse ,真的沒辦法才思考 Derivation

4. (ISP) 介面隔離:
     使用多個專門介面, 比使用單一總介面要好! 把不同的函數從介面中分離出來
    --> 不同的函數應該屬於不同的介面

5. (DIP) 依賴反轉
    高階模組不應依賴低階模組,兩個都應該依賴在抽象概念上
    抽象不應該依賴於細節, 細節應該依賴於抽象!
    --> 針對介面寫程式
    --> Dependency Injection 是實作 DIP 的手法 (例如: 通過Constructor注入依賴)
    --> 若一個Constructor注入太多的依賴,則此Class 可能違反了SRP

SRP 與 OCP 都只是一個方向, 不是教義! 寫程式要專注一個主要的核心任務, class要盡可能簡單, 但是不是教義!

2017年5月18日 星期四

Callback 的意義

引用http://www.programmer-club.com.tw/showSameTitleN/c/20869.html

callback,字面上的解釋就是「回呼」,這牽涉到多工作業系統中兩個同時執行﹝concurrent﹞的不同模組。

一種情形是,A 模組給 B 模組一個 function pointer,請 B 在處理完某項工作後,或是在適當時機,使用這個 function pointer 來呼叫該 function 函式。
例如,A 模組裡面寫了一個 function 叫做 CallMeIfDone,然後它啟動了 B 模組,並且把 CallMeIfDone 的 pointer 傳給 B 模組。A 模組繼續執行它的工作,B 模組也同時在處理它的事情,等到 B 模組忙完了,它就會呼叫 CallMeIfDone,但是這個函式是寫在 A 模組裡面的,所以實際上是跑回來 A 模組的地盤執行 CallMeIfDone,因此就稱為「回呼,callback」。

另一種情形是,B 模組是一個獨立執行的模組,專門處理使用者輸入,每當使用者敲一下鍵盤,或是動一下滑鼠,它就會產生一個事件,需要處理這些事件的其他模組必須向 B 模組登記 callback,例如 A 模組向 B 模組登記了 KeyboardEvents 的 callback,那麼 B 模組在偵測到鍵盤動作時,就會去呼叫這個callback了,當然這個callback也是寫在 A 模組裡面的。

2017年1月3日 星期二

MVC 架構 - 以 Hyena 為例

MVC 架構以 M 最為重要! 說明如下:
  • Model: 存放資料,當資料改變時,透過 C 來更新V
  • View: 只是視覺化Model
  • Controller: 當 M 改變時,用來更新V
為了達到 "當 M 改變,透過 C 來更新V" 的目的,Controller 要能夠看得到Model 與View:


其中,Controller 的 RegisterView() 如下:

如此便可以把 M 的改變 呈現在 V  上面。

MVC的優缺點如下:
** 優點:
  • 可以用不同的View 呈現相同的Model
  • 容易對 Controller 進行測試 (Testability => mockup Model for testing),適合TDD

**缺點:
  • 採用Event-driven,是一種複雜的UI design pattern
  • 需要透過Controller 來更新View,很耗資源 



另外,請參考Hyena的Class diagram,Model 也用來執行真正的Business:


MVC 不是一種技術, 而是一種設計理念!