使用一模一樣的資料庫,一個 run 在 SQL Server 2005, 一個則是 SQL Server 2000。
開發時使用 Linq to SQL連線到 2000 的資料庫。
執行時分別連線到 2000 及 2005.
發現執行的結果是一樣的,但使用 profiler 看到的 sql script 卻完全不同。
由於目前測試的是客戶的專案,不能放到這裡來公佈。
只能說,SQL Server 2000 趕快放棄吧。
使用一模一樣的資料庫,一個 run 在 SQL Server 2005, 一個則是 SQL Server 2000。
開發時使用 Linq to SQL連線到 2000 的資料庫。
執行時分別連線到 2000 及 2005.
發現執行的結果是一樣的,但使用 profiler 看到的 sql script 卻完全不同。
由於目前測試的是客戶的專案,不能放到這裡來公佈。
只能說,SQL Server 2000 趕快放棄吧。
所有的程式寫作的開發方式,其實都是下面三個的混合
一次針對一個 Use case 下一個 scenario 進行開發。再逐步完成該Use case 下所有的scenario。完成該Use case 下所有的scenario後才對下一個 Use case 開發
一次對針一個系統行為的特色來開發。
針點系統的一個功能寫出 test cases。寫程式的目的就是通過所有的 test cases
如果不透過繼承,又希望從別的類別得到好處。可使用
一台轎車,如果想要可以欣賞音樂的能力,不是透過繼承(畢竟車子不是音響),而是在車子內加裝汽車音響。
因此,轎車內需要放音樂的能力時,只需要打開汽車音響即可。
class 轎車
{
private 汽車音響 a汽車音響 = new 汽車音響();
public void 欣賞音樂()
{
a汽車音響.打開();
}
}
或者,隨時找到一台音響再打開
class 轎車
{
public void 欣賞音樂()
{
汽車音響 a汽車音響 = new 汽車音響(); //隨時想有就可以有?這大概是軟體世界才有的能力
a汽車音響.打開();
}
}
一個士兵,需要有攻擊的能力,但士兵畢竟不是武器,因此士兵需要有武器。到目前為止就像委派。
但是,武器有許多種,如飛彈、槍、劍,每一種的攻擊方式都不同。
注意到 weapon 是可替換的,只要有實作 IWeapon 的武器就可以。換句話說,一整族IWeapon的武器都可以替換。
另外,weapon 是天生就存在於 Soldier 內的。一旦 Soldier 被 destoryed, weapon 就不存在了。
class Soldier
{
private IWeapon weapon = new Sword();
public void Attack()
{
weapon.Attack();
}
}
interface IWeapon
{
void Attack();
}
class Sword : IWeapon
{
public void Attack() { }
}
aggregation 與 Composition 類似,但結構更鬆散,更容易 resuse。上述的例子,weapon 只能生存在 Soldier 的生命週期內,並不合理。如果改成下面的例子,就是 aggregation 了。注意到 weapon 是由建構子傳進去的。當soldier1 被destoryed 後,sword 並不隨之消減。也就是說,可以被 soldier2 再拿去用。
class Soldier
{
private IWeapon weapon;
public Soldier(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack()
{
weapon.Attack();
}
}
interface IWeapon
{
void Attack();
}
class Sword : IWeapon
{
public void Attack() { }
}
class Program
{
static void Main(string[] args)
{
Sword sword = new Sword();
Soldier soldier1 = new Soldier(sword);
soldier1.Attack();
}
}
LSP (替換原則) 是談何謂「良好的繼承」。
當得到需求後,發現有些事情是「不確定」的。這些不確定的事,就是未來的風險。
在專案的過程中,最重要的就是想辦法降低風險。
如果這些風險,仍然是需求不夠清楚時,那還是回頭問客戶吧。
問完客戶後,知道了需求是什麼,記得要技術評估一下,要了解大概該需求未來該如何實作。否則容易引發「技術風險」。
但在技術評估階段時有個重點需要注意,「不要埋頭開始寫程式」。此時的最重要的目的仍是「降低風險」。
過早實作,容易模糊了此時此刻的重點,反而因為尚未了解所有的需求,不但可能做錯了方向,還容易增加專案時程或成本的風險呢。
http://msdn.microsoft.com/en-us/library/yx7xezcf(VS.71).aspx 中有描述當CLR程式執行時,載入 assembly 的順序。
因此,可以使用如下的設定,讓程式執時,除了搜尋執行程式的路徑外,也能搜尋自訂的路徑
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="myBin"/> </assemblyBinding> </runtime> </configuration>
以上程式執時,會搜尋 .\myBin 下的所有assembly
在取得 web service 的 WSDL 時,發生了一個怪現象
例如, 我要取得 http://server1.domain.com.tw/service1/myService.svc?wsdl,但在其內容,卻包含下面這一段
<xsd:import namespace="http://tempuri.org/" schemalocation="http://host1/service1/myService.svc?xsd=xsd0" />
注意到 server1.domain.com.tw 是對外的 FQDN,而 host1 是該台機器的 host name。
但,host1 對於外部來說,是不可解析的。 怎麼辦呢?
原來,只需要在 IIS 中設網站的識別碼,如下圖。
按確定後,記得要 IISReset
如果不是行為發生變化,就不值得繼承
如果子類別只是較父類別多了一些屬性,而非行為發生變化,則可考慮使用Dictionay
舉例來說,下面的程式是不好的。
class Parent { public string Name; public void Fly(); } class Child1 : Parent { public string Color; public string AliasName; } class Child2 : Parent { public string BackColor; } class Child3 : Parent { public string BorderColor; }
原因是 Child1, Child2, Child3 在行為上根本不會發生變化。還是只有 Parent 的Fly。因此,只需要修改成下面的程式,就不需要子類別了。
class Parent { public string Name; public void Fly(); public DictionaryOtherProperties {get; set;} }
雖然 VS2010看來還要很久才會到來,但有些功能我卻是迫不及待。以下是部份的功能
今天在第一次測試時,碰到這樣的訊息
The server encountered an error processing the request. See server logs for more details.
測試的過程是這樣的
public class Service : DataService{ public static void InitializeService(IDataServiceConfiguration config) { config.SetEntitySetAccessRule("*", EntitySetRights.AllRead); config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); } }
[ServiceBehavior(IncludeExceptionDetailInFaults=true)] public class Service : DataService{ public static void InitializeService(IDataServiceConfiguration config) { config.SetEntitySetAccessRule("*", EntitySetRights.AllRead); config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); } }
意思是 Company 沒有key
所以在dbml 上加上 partial class, code 如下
[DataServiceKey("OID")] partial class Company { }如此一來就解決了問題。
Textual analysis 完畢後,接著可進行更新類別圖 (class diagram)
當發現重複的程式碼片斷時,通常代表「設計」有問題。例如責任放錯了類別,或者是否應該delegate到別的類別等等。