2 Mart 2014 Pazar

HALK İÇİN Mİ DEVLET, DEVLET İÇİN Mİ HALK ?

Niyetim siyasi yorum yapmak değil sadece ülkemizde gördüğüm bir sıkıntıyı dile getirmek. Belki bir gün ülkemizde  konjünktür değiştiğinde bu yazım insanlara komik gelecek.
Neyse konuya gireyim, her gün çok sayıda ölümlü trafik kazalarını haberlerden takip etmekteyiz. Her bir kaza yürek burkan cinsten. Artık her haberde cesetlerin etrafa fırlaması, araçların toz buz olması gibi tabirleri duymak bize sıradan gelmeye başladı. Kaza resimlerine baktığımızda ise 20 - 30 yaşında eski püskü araçlar görüyoruz. Bu araçlar daha kaza yapmadan parçalanan cinsten araçlar, insan üzülüyor. Ancak lüks araç sahiplerinin bulaştığı kazalara bakınca üzüntü biraz daha artıyor. Çünkü onlar bu tarz kazaları burunları bile kanamadan atlatıyorlar. Peki gariban insanlar neden trafik kazalarında leblebi gibi yola dağılıp can veriyorlar sorusu geliyor insanın aklına. Araba ve otomobillerden alınan yüksek vergiler insanları eski püskü ve emniyet kemeri bile sonradan takılmış araçları almak zorunda bıraktırıyor. Ya da eski püskü bu araçlar hiçbir güvenlik mekanizması olmadan nasıl bu kadar rahat bir şekilde trafiğe girebiliyorlar ?
Bunları sorgulamadan edemiyor insan. Söylesen faydası yok sussan gönül razı değil misali bu şekilde düşüncelerimi naçizane ifade etmek istedim. 
Başlıktaki soruya gelince, halk devletin cari açığını kapatmak ve yüksek vergiler vermek için mi var ? 
Eğer cevap evet ise "devlet için halk" tabiri doğru olur.
Ama cevap hayır ise o  zaman "halk için devlet" tabiri daha doğru olur. 
Demem o ki yüksek güvenlikli araçlardan düşük vergi alınsa insanlar ona yönelecek ve  belki paramparça olmuş araçlar, çok sayıda ölümlü kaza haberlerinin sayısı daha da azalacaktır.

Aşağıdaki resim Şanlıurfa - Diyarbakır yolu üzerinde meydana gelen bir kazadan fotoğraf, 6 kişi ölmüş yine cesetler etrafa fırlamış vs...


9 Mayıs 2012 Çarşamba

             

             YAZILIM GELİŞTİRME TECRÜBELERİM

1- Basit Yazın

        Yazılım geliştirirken her zaman basit yapılar kullanmaya çalışın. Eğer elinizdeki bir işi gerçekleştirmek için  çok karmaşık yapılar kullanmak zorunda değilseniz. Daha anlaşılır ve basit yapılar kullanın. Kullandığınız yapıların çok kompleks olması ya da anlaşılamaz olması sizi görkemli göstermez. Aksine yaptığınız işlerin anlaşılabilirliğini azaltır veya kompleks yapı içerisinde gözden  kaçırdığınız bir nokta başınıza bela olur. Ama her adımınız kolay anlaşılır ve çok basit yapılar içerirse diğer arkadaşlarınızın işini kolaylaştırır ve bakımı mevzu bahis olduğunda rahatça el atabilirsiniz.

2- Temiz İş Çıkartın

     Herhalde bir çok yazılım geliştiricinin muzdarip olduğu konulardan biridir "Temiz iş çıkartmak". Şunu demek istiyorum başka insanların sizin yazdığınız yazılımı çökertmelerine(crash) asla izin vermeyin. Önleminizi en baştan alın ki iş elinizden çıktıktan sonra hatalarla size geri dönmesin. Çoğu kez karşılaşmışımdır yazılım geliştirirken en önemli kısımları harika şekilde tamamlar ve olay budur deyip bırakırız... Bence asıl olay  bundan sonrası. Yazılıma girdi olarak ne verilirse verilsin kullanıcı hangi butona basarsa bassın yazılımın asla  boynu bükülmemeli. Yani demem o ki ufak tefek diye önemsenmeyen kısımları kesinlikle ertelemeyin veya yapmamazlık etmeyin. Yazılım içerisinde arayüzden tam sayı olarak beklediğiniz bir yazı kutucuğuna(textbox) her zaman tam sayı girilmez. Bu durum her zaman aklınızda olsun. Millet olarak böyle şeylere çok meraklıyız.. 


Son kullanıcıların yazılımla ilk karşılaşmaları genelde şu şekilde olur:
"Acaba bu doğum tarihi bekleyen yere negatif bir sayı girsem ne olur... Hahahah... adamın yaptığı yazılımı hekledim...."   :)


Oysa bir yazılımcı için bunun kontrolünü yapmak 5 dakikalık iş.



3- Hatayı İzole Edin

     Her zaman başımıza gelebilecek bişeydir hatalar(exception). Kimi zaman elimizi kolumuzu bağlayan bu durumlara karşı iyi önlemler alınırsa sistemin genelini etkileyecek hatalar önlenmiş olur. Yazılım geliştirirken her adımı birbirinden iyi ayırmalıyız. Bir adımda meydana gelen sonraki adımları etkilememeli. Eğer hata ölümcül bir hata değilse sistem çalışmasına devam etmeli ve sistemdeki veriler kesinlikle kaybedilmemelidir. Yani örnek vermek gerekirse Java'da catch'lerin için iyi doldurun onlar hayat kurtarır.



Aklıma geldikçe tecrübelerimi eklemeye çalışacağım ... iyi çalışmalar.

18 Eylül 2011 Pazar

Strategy Pattern

Yazılım tasarımı yaparken bazen aynı tipteki objelerin çalışma anında farklı özellikler göstermesini bekleriz. Yani objelerimizin polimorfik davranmasını isteriz. Bu programcılık dünyasında alışık olduğumuz polymorphism özelliğinden yararlanarak gerçekleştirlen bir tasarım kalıbıdır.

Burada amaç sınfıımızda değişmeyen yerler ile değişen yerleri birbirinden ayırmaktır. Değişmeyen yerler zaten inheritance ile tekrar kullanabilir kodlar elde etmemizi sağlayacak. Ama değişen yerler inheritance durumunda sürekli bakım(maintenance) gerektiren alanlardır ve vakit kaybına neden olan kısımlardır. Yeniden yeniden değişiklik yapmamıza sebep olan kısımları sabit kalan kısımlardan ayırıp bunları encapsulate edersek. Yani diğer kısımlardan soyutlar ve kendi içinde bir yapı kurarsak daha başarılı bir tasarım ortaya koymuş oluruz. Bunu sağlamak için Strategy Pattern kullanırız. Burada yapacağımız şey sürekli değişen kısımları alıp burada da kendi içerisinde bir sınıflandırma ve hiyerarşi sağlayarak tek tip ama farklı davranışlar sergileyen bir yapı kurmak.

    Örnek vererek açıklayalım; Bir tane simülasyon yaptığımızı düşünelim. Simülasyonda çeşit çeşit hayvanları simüle edelim. Tasarım olarak düşünürsek tüm hayvanları Animal nesnesinden türetelim tüm hayvanlarda ortak olan özellikler
     * Hareket ederler.
     * Belirli şekillere sahiptirler.

Bu Animal sınıfı abstract bir sınıf olacaktır. Çünkü tüm hayvanlar için ortak olan özellikler burada kodlanacaktır. Bu Animal sınıfından Cat, Fish, Bird sınıflarını türetelim. Bu hayvanlarda hareket etme farklı şekillerde gerçekleşir.  Animal sınıfı içerisinde move adında bir method tanımlayıp karada yürüme hareketini kodlayabilirz.Altsınıflarda da karada yürümekten farklı hareketler için örneğin yüzme ya da uçmak için bu methodu override edebiliriz.Ancak her  farklı hareket için bunu override etmek tekrar kullanılabilir kod yazmak için pek de mantıklı bir çözüm değil. Bu noktada Strategy Pattern kullanarak çalışma zamanında belirtilen hayvan için hangi hareket şekli uygunsa ona karar verip o hareketi gerçekleştirmesini sağlayabiliriz. Dikkat edersiniz Animal sınıfından türetilen sınıflarda değişen kısım move işlemidir. Bunu Animal sınıfından alıp kendi içerisinde encapsulate edersek; MoveBehavior adında bir interface oluşturursak ve bu sınıftan da WalkBehavior , SwimBehavior, FlyBehavior sınıflarını türetirsek kendi içinde özelleşmiş ama aynı tipten türetilmiş objeler elde ederiz. Yani MoveBehavior tipindeki bir değişkenimize WalkBehavior objesi atarsak yürüme, SwimBehavior objesi atarsak yüzme, FlyBehavior objesi atarsak uçma işi yapacaktır.  Bu şekilde Animal sınıfı içersinde MoveBehavior tipinde bir değişken tutarsak ve bunun set edilme işlemi alt sınıflar tarafından gerçekleştirilirse çalışma zamanında bu değişkene hangi tip obje atanırsa o sınıfa özgü hareket sergilenecektir. Çalışma zamanında bir hayvan farklı hareketler gerçekleştirebilir. Örneğin bir ördek havadayken uçmakta karadayken de yürümektedir. Strategy Pattern sayesinde çalışma zamanında hareket şeklini değiştirebiliriz.




MoveBehavior Sınıfı:



WalkBehavior Sınıfı:



SwimBehavior Sınıfı:



FlyBehavior Sınıfı:



Animal Sınıfı:



Cat Sınıfı:



Fish Sınıfı:



Bird Sınıfı:



AnimalSimulator Sınfı:



Ekran Çıktısı: