|
C# Programlama Rehberi - 1 |
|
Gönderiliyor lütfen bekleyin... |
|
|
Geçen gece evdeki
bilgisayarımda elektronik kitaplarımı karıştırırken rastlantı eseri gözüme takılan
ve okuduğumda çok hoşuma giden bir rehber oldu. Rehberde C# ile nesne yönelimli
yazılım geliştirirken hem tasarım hem de uygulama aşamasında bizlere çok yradımcı
olacak tavsiyeler bulunmaktaydı. Bu altın değerindeki öğütleri tüm yazılımcı
arkadaşlarla paylaşmak istedim. Hatta okurken kendi kendime yaptığım yorumları
da Çevirmenin Notu şeklinde sizlere aktarmayı uygun gördüm.
Rehberde altmışın
üzerinde madde olmakla birlikte bunların yarıya yakını sistem analizi ve tasarımı
ile ilgilidir. Diğer kalan ksımı ise sistemin uygulanması(implementasyonu) konusunu
kapsamaktadır.
Bu
belge Thinking In C# (Larry O’Brien & Bruce Eckel ) kitabının sonundaki
EK C’den Türkçe’ye çevrilmiştir.
Bu dökümanda;
yazılım geliştirirken alt seviye tasarım ve kod yazma hususunda biz programcılara
yardım edecek, rehber olacak, bir takım öneriler bulunmaktadır. Burda yazılanlar
birer öneri olup birer kural olarak algılanmamalıdır. Dökümanda bahsedilenler
önceki deneyimlere dayanarak ortaya çıkan parlak fikirler olarak da görülebilir.
1.
Tasarımdaki zerafet her zaman kazandırır: Herhangi bir yazılım
tasarımı sırasında dikkatli ve olabildiği kadar güzel tasarlamanız size ilk
bakışta çok zaman kaybetttiğiniz hissini verebilir. Fakat tasarladığınız sistem
veya modül çalışmaya başlayınca siz aslında çok şeyleri kazandığınızı farkedeceksiniz.
Bunlardan bazılarını sayacak olursak; benzer bir durumda ya tasarımınızı aynen
kullanabileceksiniz ya da çok az bir değişiklikle aynı tasarımı kullanmaya imkanınız
olacaktır. Bu sayede belki tasarrufunuz saatleri, günleri ve hatta haftaları
bulacaktır. İyi bir tasarım sistemi daha hızlı oluşturma ve hata ayıklamanın
yannında daha kolay anlaşılmasına ve güncellenmesine de yardımcı olacaktır ki
bu da vakit nakittir prensibi ile yakından ilgilidir. Bazen siz zarif bir iş
yaparken kimileri sizin çok çalıştığınızı fakat verimli olmadığınız iddaa edebilir
ki siz bunlara kulak asmayın. Diğerleri gibi hızlı iş çıkarmaya çalışmak aslında
proje(ler)in daha yavaş ilerlesine yolaçacağına emin olabilirsiniz.
2.
Önce çalışan sonra hızlı çalışanı yap: Eğer projenizde bir yer
sistemin darboğazı ise ilk etapta onun doğru çalışanını yapın. Sistemdeki darboğaz
ile ilgili kısmı olabildiği kadar kolay ve anlaşılır biçimde hazırlayın ve çalıştırın.
Sonra performans testlerine tabi tutun. Eğer testlerde büyük bir hız sorunu
varsa onu düzeltmeye kalkın. Çoğu zaman darboğazın sizin için aslında çok önemli
bir problem olmadığını farkedeceksiniz. Sizin için önemli olan zamanını idareli,
tasarruflu, kullanmaktır.
Çevirmenin
Notu: Donanım güngeçtikçe artan bir hızla ucuzluyor. Ama
yazılım projelerinde sizin vaktiniz çok kıymetli ve sınırlıdır. Ondan dolayıdır
ki .NET’i ve RAD kullanmak giderek popüler oluyor.
3.
“Parçala, böl ve yut” prensibini her zaman akılda tut: Eğer çözmeniz
gereken sistem çok karmaşık ise; programda en temel görevi veya işlevi yapan
parça nedir onu bulmaya çalışın. Bu temel görevi yapan sınıfı yazdıktan sonra,
diğer yan parçaları ya temel parçaya birşeyler ekleyerek (türetme, veya inheritance
ile) veya temel parçayı destekleyici parçalar (sınıflar) geliştirerek sistemin
tamamını oluşturun.
4.
Sınıf tasarımcısı ile sınıf kullanıcısını birbirinden ayırın:
Sınıf tasarımcısının hazırladığı sınıfları kullanan programcılar genelde “müşteri”
olarak andlandırılır. Müşteri programcılar sınıfların içinde neyin olup bittiğini
bilmelerine gerek yoktur. Sınıf tasarımcısı, sınıf oluşturmada tam bir uzman
olmalıdır ki en acemi programcı bile onun tasarladığı sınıfları kolaylıkla kullanabilmelidir.
Sınıf kütüphanelerinin kullanım kolaylığı direk olarak sınıfın ne kadar taransparan
yazıldığına dayanır.
Çevirmenin
Notu: Sınıflar kullanırken onların içinde neyin olup bittiğinin
bilinmesine ihtiyaç duyulmaması Nesne Yönelimli Programlamanın en temel prensiblerinden
biri olan sarmalama (encapsulation) olarak adlandırlır.
5.
Sınıfları oluşturuken isimlendirmeleri sınıf elemanlarının amaçlarını açıklaycı
bir şekilde yapın: Bu sayede müşteri programcı için sınıf arayüzünün
çok kolay anlaşılır olması hedefine ulaşabiliriz. Ayrıca gerekirse aynı işleri
yapan farklı parametre alan metodlar içinde, metotlara aşırı yükleme (method
overloading) kullanmanız çok uygun olacaktır.
Çevirmenin
Notu: Metodlara aşırı yükleme ayın işi yapana fakat farklı parametre
alan metodlara aynı isimleri verme kuralına dayanır. Mesela .NET snıf kütüphanesindeki
Convert sınıfında tek bir ToInt32() metodu olmasına karşın, bu metota 18 defa,
herbiri ayrı parametreler sayesinde, aşırı yüklenmiştir.
6.
Sistem analiziniz ve tasarımınız, en az olarak, sistemdeki sınıfları, onların
public arayüzlerini ve diğer sınıflarla ilşkilerini, özellikle temel sınıflarla
üretmeli: Eğer sizin tasarım yönteminiz bundan daha fazlasını
üretiyorsa; kendinize ekstraların programın yaşama süresi boyunca ne kadar değerleri
olduğunu bir sorun. Genelde yazılım geliştirme takımındakiler kendilerinin verimliliğne
pek bir katkısı olmayan parçaların bakımını yapmaya yanaşmazlar. Ayrıca bu gerçeği
bir çok sistem tasarım metodolojisi gözardı ediyor maalesef.
7.
Herşeyi otomatikleştirin: Sınıfın kodunu yazmadan önce, sınıfı
tüm özellikleri ile test eden metodu yazın ve bunu sınıf içinde barındırın.
Test kodunun çalışmasını makefile veya benzeri bir araçla otomatik hale getirin.
Bu sayede sınıfın kodu içinde meydana gelen her türlü değişikliğitest kodu ile
test edip muhtemel bir çok hatayı kolayca farkedip düzeltme imkanınız olacaktır.
Her ne kadar derleyiciler ve yazılım geliştirme araçlarında inanılmayacak kadar
çok kontrol özellkileri eklendiyse de ( tip kontrolü, hata ayıklama ve otomatik
sözdizimi düzeltimi gibi) bunlar bir yere kadar kodun doğrulunu garanti edebiliyorlar.
Eğer sağlam ve güvenilir bir sistem geliştirmek istiyorsak mümkün olduğu kadar
dikkatli ve emin adımlarla ilerlemiyiz. Bunu sağlamak için iyi hazırlanmış test
kodları ile sınıfın veya programın doğru çalıştığına emin olmalıyız.
Çevirmenin
Notu: Window XP projesinde yazılan kodların en
az %20 - %25’nin test kodları olduğunu söylersem galiba profesyonellik
ve başarı açısından test kodlarının sanırım ne kadar önemli olduğunun altını
çizmiş olurum.
8.
Bir sınıfın kodunu yazmadan önce onun test kodunu yazınız: Bu
tür bir yaklaşımla sınıf tasarımınızın tam anlamıyla doğru ve eksiksiz olduğunu
doğrulayabiliriz. Ek olarak, test kodunu yazarken sınıfla ilgili gözden kaçan
ve gerekli özellikler ve kısıtlamaların da (genelde tasarım ve analizde farkedemediğiniz)
gözünüze çarpmasını sağlar. Test kodunun başka bir yararı da, doğal olarak,
sınıfın kullanıma ilişkin bir örnek teşkil etmesidir.
9.
Tüm yazılım geliştirme problemleri ek bir konseptsel yön değiştirme ile daha
da basit bir hale getirelebilir: Bu yazılım geliştirme mühendisliğinin
en temel kurallarından biri olup nesne yönelimli programlanın da dayandığını
prensiblerden biridir.
10.
Yön değiştirme anlamlı olmalı: Burdaki anlamlı biçimde yön değiştirme
en basit hali ile çok kullanılan kodları aynı metod içine koymak olacaktır.
11.
Sınıfları olabildiğince küçük tasarlayın: Her bir sınıfın tek
ve iyi belirlenmiş bir amacı olmalı. Eğer sınıf tasarımınız çok karmaşık ve
uzun olduysa onu daha basit parçalara ayırmayı deneyin. Herhangi bir sınıfın
ne kadar sade olduğunun göstergesi: onun eleman sayısı( metotler, üye değişkenleri
vs.. ) ve üzerinde yapılan değişiklerin çok olmasıdır. Bu tür durumlarda sınıfı
bölerken bir kaç ipucu olarak şunları kullanın:
- Karmaşık
switch yapısı:
çok biçimliliği kullamayı deneyin.
- Çok
sayıda ve değişik türden işleri yapan metotlar: değişik sınıflar
oluşturmayı deneyin.
- Çok
sayıda ve değişik türden sınıf üye değişkenleri: değişik sınıflar
oluşturmayı deneyin.
12.
Çok sayıda argüman alan metotlara dikkat edin: Metotları çağırmak
karmaşık hale geldiği gibi, kod içinde metodu çağıran kısımları da okumak ve bakımını
yazmak güçleşecektir. O zaman metoda argüman olarak nesne geçirmeyi deneyiniz.
Çevirmenin
Notu: Hatta sırf bu amaçla sınıf veya yapı dahi oluşturabilirsiniz.
Böylelikle sadeliği korumuş ve uzun vadede çok değişik kazanımlar elde ettiğinizi
gözlemleyeceksiniz.
13.
Kendinizi tekrarlamayın: Eğer türeyen sınıflardan bir çoğunda
tekrarlanan kod parçası olduğunu gözlemlerseniz; o kod parçasını temel sınıfa
koyunuz ve onu temel sınıftan çığırın. Bu sayede sadece kodun daha kısa olmasını
sağlamazsınız, ayrıca tekrar eden ksımlardaki değişikler için tek bir örneğini
değiştirmeniz yeterli olur. Bazen de böyle bir keşif sizin arayüzünüze değerli
bir katkı da sağlacaktır.
Çevirmenin
Notu: Bir çok nesne yönelimli programlama anlatan
kaynaklarda geçen gemotrik şekillerle ilgili bir sınıf kütüphnesini tasarımından
örnek verelim. Diyelim sizin kare, dikdörtgen ve eşkaner dörtgen isimli üç sınıfınız
var. Bu üç sınıf için gerekli olan Çiz() metodunu herbirinde tekrar tekrar yazmaktansa,
üçünün birlikte türediği dörtgen sınıfında yazmak ile daha az kod yazmış olursunuz.
İleride ParaleKenar isimli bir sınıfa ihtiyacanız olunca; bu sınıf için tekrardan
Çiz() metodunu yazmaktan kurtulursunuz. Hatta ilk versiyonda tek bir kalem (sabit
kalınlık ve renk) ile çizim yaparken ilerki versiyonlarda farklı kalemler( kalınlık
ve renk detaylarıyla) ile çizmek gibi özellikler ekleyince tüm dörtgenler için
tekbir Çiz() metodu tanımlamanın size kazandıracağı zamanı ve sistemin sadeliğini
düşünün bir!
14.
switch ve çoklu if-else yapılarını gözlemleyin: Bunlar genelde
tip-kontrollü kodlamanın göstergesidir. Yani, siz tip bilgisine göre hangi kodu
çalıştıracağınıza karar veriyorsunuz(genelde tip bilgisi belli olmayabilir)
demektir. Bu tür durumlarda switch ve ve if-else yapıları yerine kalıtım ve
çok biçimliliği kullanın. Çok biçimli bir metot sizin yerinize tip kontrolünü
yapar ve argüman tipine göre gerekli işleri yapar veya türeyen sınıflar vasıtası
ile yaptırır. Yine kodunuz daha kolay okunabilir ve kolayca genişleyebilir bir
hal alır.
Çevirmenin
Notu:
Yine gemoetrik şekiller ile ilgili sınıf kütüphanemizi düşünelim. Çiz() metodu
3 farklı parametreye bağımlı olarak işini yaptığını varsayalım. Bunlardan birincisi
şekil, ikinicisi kalem ve üçüncüsü ise çizgi tipi (kesikli, noktalı, normal
veya herhangi başka bir özel şekillerden biri..). Sizin de farkedeceğiniz gibi
minumum olarak bizim şekil parametresidir. Diğerleri ise seçimliktir(opsiyonel).
Bu
durumda tüm parametre kombinasyonlarında göre ya dört farklı metot yazmalıyız
ki bunların isimleri farklı olmalıdır:
a.
Çiz_Tam( şekil, kalem, çizgiTipi )
b. Çiz( şekil )
c. Çiz_Kalemli( şekil, kalem )
d. Çiz_Şekilli (şekil, ÇizgiTipi )
Ya
da tek bir çiz metoduna kalem ve çizgiTipi nesnelerinin birini veya ikisini
null olarak geçirmeli ve biraz karmaşık if-else ifadesi kullanmalıyız. Her iki
durumda da tasarmızın karmaşıklığı ve kullanım zorluğu olduğu açıktır. Ama biz
çok nesne yönelimli programlamanın en temel özelliklerinden biri olan biçimlilik(polymorphism)
ile bu tür sorunları kolayca aşabiliriz. Metot isimleri aynı kalmak şartı ile
parametre lsitelerini değiştirince Çiz metodunun 4 farklı hali şunlar olacaktır:
a.
Çiz( şekil, kalem, çizgiTipi )
b. Çiz( şekil )
c. Çiz( şekil, kalem )
d. Çizi( şekil, ÇizgiTipi )
15. Tasarım aşamasında, değişebilir ve değişmeyen
parçaları ayırmaya çalışın: Sistemde değişebilir elemanların
olup olmadığını araştırın. Değişebilirleri ayrı sınıflar olarak tasarlayın ki
ilerde bunlardaki değişmeler tüm sistem tasarımını veya önemli bir bölümünü
değiştirmeye zorlamasın sizi.
Makale:
C# Programlama Rehberi - 1 C#, Visual C# ve .NET Ahmet Faruk Nacaroğlu
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|