Implementasyon(Uygulama-Gerçekleştirme) - 2
47.Derleme zamanı hatalarını çalışma zamanı hatarına
tercih ediniz: Bir hatayı yakalarken mümkün olduğu kadar meydana geldiği kısma yakın
bir yerde yakalayın. Hataları çözmeye çalışırken oluştukları yerlere yakın kısımlarda
arayın. İstisnayi durumları, hata hakkında en çok bilgi verecek yerlerde
yakalamaya gayret edin. Eğer hata mesajından bir ipucu yakalayamıyorsanız hatanın
içindeki hatalara bakın.
Çevirmenin Notu:
InnerExection’lara bakmanızı tavsiye ediyorlar.
48. Şişman metotlara dikkat edin: Metotlar kısa, öz ve
anlamlı olmalıdır. Eğer bir metot çok uzun ve karmaşık ise onun bakımını yapmak
güç olur ve büyük ihitmalle birden fazla işi tek başına yapıyordur. Bu tür
metotların alt metotlara bölünmesi tavsiye edilidiği gibi siz onu ayrı bir sınıf
olarak da implemente etmeyi bir düşünün. Ayrıca küçük metotlar sınıf içinde
kodun tekrar kullanımına da (code reuse) imkan verecektir. Fakat, bazen uzun
metotlar vardır ama onlar yine de tek bir iş yapmakla yükümlü olmalıdırlar.
49. Olabildiğince herşeyi gizli tutmaya çalışın: Bir sınıf kütüphanenizin
belirli bir kısmının kodunu başkalarına açmanız tavsiye edilmez. Çünkü bu başkalarının
kodunu baştan tasarlamasına ve yazmasına yolaçacaktır. Eğer sadece sınıfların
arayüzlerini yayımlarsanız, başkalarının kodunu değiştirmeden kendi sınıflarınızın
içsel çalışmasını zamanla geliştirirsiniz. Bu durumda sizin implementasyon değişikliklerinizden
başkalarının etkilenmesini minimum derecede etkiler.
50. Hiç çekinmeden bol bol yorum satırları ve Xml
yorum söz dizimini kullanınn: Fakat yorum satırlarınız sadece kodun ne yaptığını
sözlü anlatan sıkıcı eklentiler olarak kod içinde barınmasınlar. Daha çok neyi
yapmak istediğinizi ve önemli noktaları yorum olarak yazınız. Ayrıca sınıfınızın
içindeki metotların amaçları .NET sınıf kütüphanesinde sık kullanılan metotlar
ile örtüşüyor ise onların isimlerini .NET kütüphanesindeki isimlerden seçiniz.
Çevirmenin Notu: Eğer
kendinize has bir container sınıfı geliştiriyorsanız ve eleman sayısını
dönderen bir özelliğiniz varsa onun ismini Count seçmeniz. uygun olacaktır. Ya
da ayın container nesnenizin içinde bir elemanın olup olmadığı dönderen metot
ismini IsExist() yerine Contains() olarak verirseniz;sınıfınız kullananlar
kolayca sizin sınıfınıza adapte olabilirler.
51. “Sihirli numaralar” kullanmayınız: Kod içinde bir takım
sabit sayılar kullanmak gerekebilir. Kodun bakımını yaparken bunları değiştirmek
gerektiğinde neyin ne olduğu açık olarak belirtilmemişse işler karışabilir.
Mesela kod içinde geçen bir “100” sayısı ne acaba? Bir dizinin kapasitesi mi?
Yoksa bambaşka bir şey mi? Onun yerine ismi açıklayıcı olan sabit(constant) tanımlamak
daha mantıklıdır. Çünkü; sabitin ne işe yaradığını anlamak ve dolayısıyla bakımını
yapmak çok kolaylaşır.
52. Yapılandırıcıları yazarken istisnai durumları düşünün: En mükemmel senaryoda
bir yapılandırıcının istisnai durumlara açık olmaması dolayısıyla hata oluşma
ihitimalinin sıfırlanmasıdır. Mükemmel bir senaryoda ise sınıfımızın tutarlı sınıflardan
oluşması ve/veya türemesiyle istisnai durumlarda temizleme işlemine gerek
kalmamasıdır. Yoksa temizliği yapılandırıcı içindeki finally deyimi kod bloğu
içinde yapmak zorunda kalırsınız. En azından herhangi bir yapılandırıcıda
istisnai durumda hatayı fırlatmalıyız ki; bu sınıfı oluşturan koda
bildirmeliyiz. Öteki türlü sınıfımız oluşturmak için çağıran kod hiç bir şey
olmamış gibi yolunda devam etmesin.
53. Eğer sınıfız herhangi bir temizle işlemi
gerektiriyorsa, sınıfın bir örneği ile çalışma bitince/ömrü sonlanınca, sınıfınızın
IDisposable arayüzünü implement etmelidir.
54. Eğer sabit sayıda nesneler alan bir container’
sahip olacaksanız onu dizi olarak hazırlayın: Özellikle bir metot bu şekilde bir container
dönderecekse bu tür bir strateji izleyiniz. Böyle bir yaklaşım size bazı
yararlar sağlayacaktır. Bunlardan başında .NET’in dizilerdeki derleme zamanı
tip kontrolü ve bu diziyi kullanacak metodun dizinin elemanlarını uygun tür
dönüşümüne tabi tutması gelir.
55. Soyut sınıflar( abstract classes )’dan önce arayüzleri(interfaces)
kullanmayı düşünün: Eğer herhangi bir sınıf başka sınıflara temel/ana sınıf olabilecekse o
sınıfı arayüz olarak implemente etmeye çalışın. Eğer metot tanımlarını ve değişkenlerinizi
ilerde değiştirmek zorunda kalacağınıza inanıyorsanız bu sınıfı soyut sınıf
olarak geliştirin. Bir arayüz sınıfları kullananlarla iletişim içindedir. İletişimin
amacı ise sınıfı kullanan kodun ne yapmak istediğine odaklıdır. Arayüzü
kullanan sınıf(lar) ise gerekli işlevlerin nasıl yapılacağı üzerine yoğunlaşırlar.
56. Yapılandırıcılar içinde sadece sınıfın örneğinin(
nesnenin ) gerekli duruma getirme işini yapın: Özellikle yapılandırıcı içinde diğer metotları
çağırmaktan çekinin. Çünkü sizin sınıfınızı kullanarak türetilen başka bir sınıf
içinde sizin ilgili yapılandırıcınıza aşırı yükenilmiş olunabilir. Bu tür
durumlar ise istenmeyen sonuçların doğmasına davetiye çıkarabilir. Küçük ve
basit yapılandırıcılar istisnai durumların veya başka bir takım sorunların çıkmasını
önleyecektir.
57. Yanlışlıkla aşırı yükleme yapılmasına engel olun: Eğer türeyen sınıfta ana
sınıfın bir metodunun üstüne yazmaya çalışırken, ana sınıfın sanal metodunun(
virtual ) ismini doğru yazmamışsanız, üstüne yazma yerine( override ) yeni bir
metot üretmiş olabilirsiniz. Bu durumda kodunuz büyük ihtimal çalışacaktır. Ama
doğru çalışmama ihtimali yüksektir!
Çevirmenin Notu: Aşağıdaki
örneği bir inceleyiniz:
class YanlisUstuneYazmak
{
public static void Main()
{
YanlisUstuneYazmak yanlis = new YanlisUstuneYazmak();
class YanlisUstuneYazmak
{
public static void Main()
{
YanlisUstuneYazmak yanlis = new YanlisUstuneYazmak();
Console.WriteLine( yanlis.ToString() );
Console.WriteLine( yanlis.ToString( DateTime.Now ) );
}
Console.WriteLine( yanlis.ToString( DateTime.Now ) );
}
// Ana sınıfın (object) ToString() metodunun üstüne
yazıyoruz:
public override string ToString()
{
return ("Ana sınıfın ToString() metodunun üstüne yazdık... ");
}
public override string ToString()
{
return ("Ana sınıfın ToString() metodunun üstüne yazdık... ");
}
// Ana sınıfın (object) ToString() metodunun üstüne
yazmak yerine yeni bir metot yazıyoruz:
public string ToString( DateTime zaman )
{
return ("Yanlışlıkla yeni metot yazdık" + zaman.ToString() );
}
}
public string ToString( DateTime zaman )
{
return ("Yanlışlıkla yeni metot yazdık" + zaman.ToString() );
}
}
58. Program kodları yazıldığından çok daha kısa sürede
okunduğunu unutmayınız: Temiz bir kodun anlaşılması kolaydır. Fakat yorumlar, detaylı açıklamalar
ve hatta örnekler kodunuzu mükemmelleştirir. Bu tür güzellikler size ve başkalarına
kodunuz okurken veya anlamaya çalışırken çok yardımcı olacaktır. Eğer bu
güzellikler yoksa kodunuzu anlayama çalışanın vay haline!
Hiç yorum yok:
Yorum Gönder