2010-11-14

解決專案中不同Naming的問題

問題:
專案遇到一個滿棘手的問題,原本使用者需求希望我們產生的表單編號是(合約編號-四碼流水號)
假設合約編號是XR-332211,那所產生的表單單號為XR-332211-0001,這是原先的需求。

但是需求總是會變動的,這次使用者又覺得說這樣的表單單號太長,因為受限於一些環境需求,
而我們被迫要變動我們的程式。。。

若我們根據新需求來變動,那接下來問題又來了,若是現在這個專案是這樣,另外一個專案又需要另外的命名規則時,
我們是不是又要變動程式碼?這對我們程式設計師來說,最不希望看到的現象[不停的在修改我們的程式]。

解決方案:
跟林大哥討論完之後,他給我一個架構如下
image
我們在程式裡面針對Naming Rule設計一個合約(INaming),一個很簡單的GetName Method
image 
接下來,我們實際設計一個Naming的物件(NC6Naming),並實作INaming的GetName
image 

在這個物件中,建構式變成很重要的一個角色,
因為這裡需要別的地方提供所有可以供Naming的資料,
(此例中SpoolBaseObj有許多可以提供Naming的資料)

然後在ClientAPI中利用Reflect來操作IName取得表單命名字串。
image 
這樣若往後需要不同的專案時,可以再新增Naming的物件,
只要在ClientAPI中,告訴它要使用的是哪一個Naming物件,就可以不用到修改原始程式碼,
又能接受這樣的需求變更。

一個Class可以同時擁有兩個以上相同的Property或Method

看到這個標題,應該有很多人會感到很疑惑??

(蝦米??一個Class可以有兩個以上相同的Property或Method,怎麼可能?)

其實,若是操作Interface的話,這就不成問題

首先設計兩個不同的Interface(IA、IB),但是設計相同的屬性與Method

image 

再來設計一個Class(TestInterface),並實作IA、IB

image

接下來實際操作這個物件,但在操作的時候請轉型成IA or IB操作

這樣就可以同一物件兩個以上相同屬性的操作

image

結果

image 

這要使用在真正的設計中,其實還沒有頭緒??該用在哪?

我在想若是要使用來擴充新Method時,

但是卻遇到與之前所設計的Method有相同名稱時,可以借由這個方式另外操作??

(Method無法被Override的時候,只是那既然這樣到不如就設計一個新的Method就好?)

或許以後會有新的看法,先記錄下來。

2010-06-16

複習使用Attribute方法

已經很久沒使用Attribute的方式來設計程式,
今天有一個新專案正好可以適用到這個架構,
乾脆就順便來記錄一下,題外話結束。

1.首先建立一個Class並繼承Attribute

   1:  public class InfoAttribute:Attribute

2.並設定AttributeUsage屬性

   1:  [AttributeUsage(AttributeTargets.Class)]
   2:  public class InfoAttribute:Attribute

3.建立建構式(Constructor),到這一步驟其實設計已經完成。

   1:  public InfoAttribute(string BOName, ClassificationType mDocType)
   2:   
   3:  {
   4:          BONameField = BOName;
   5:          mDocTypeField = mDocType;            
   6:  }

4.在自訂的Class上設定屬性資訊,可以看到下例兩個設定值,這是建構式所需要的。

   1:   [InfoAttribute("DocMaster", InfoAttribute.ClassificationType.DocMaster)]
   2:   
   3:  public class DocMasterInfo

5.若要在程式中使用屬性(Attribute),可使用System.Attribute.GetCustomAttribute的方法

   1:  Type t = this.GetType();
   2:   
   3:  Type tAttribute = typeof(InfoAttribute);
   4:   
   5:  _InfoAtt = System.Attribute.GetCustomAttribute(t, tAttribute) as InfoAttribute;

其中GetCustomAttribute會回傳Object型態的物件,
將它轉型成剛剛自訂的Attribute(InfoAttribute),即可在程式中使用。

使用Attribute的時機,通常是已經知道這個物件的特性,
藉由屬性設定來訂定物件的相關特性,
而不用藉由一堆程式撰寫,將這些已知的屬性設計進Class中,
在WCF裡,使用屬性方式來訂定傳輸的一些設定,透過屬性的設定之後,
就可以完成物件的設計。

PS.寫得很亂,還是先大致寫到這。