2 Ekim 2010 Cumartesi

Head First Object Oriented Analysis and Design Kitabı

Stajda nesne yönelimli programlama tekniğini daha iyi anlamam için head first yayınlarının object oriented analysis and design kitabını okumam istendi. Kitap daha önce karşılaşmadığım bir anlatım tekniğiyle yazılmıştı. Kitapta bolca görsel öğeler kullanılarak anlatılacak konular okuyucuyu sıkmayacak bir şekilde aktarılmaya çalışılmıştır. Kitapta nesne yönelimli programlamanın önemini vurgulamak amacıyla çeşitli problemler tanımlanıyor. Problemler ilk başta nesne yönelimli programlama teknikleri kullanmadan da çözülebiliyor olmasına rağmen daha sonradan programa yeni bir şeyler eklenmek istendiğinde nesne yönelimli programlamanın önemi, yenilenebilirlilik kavramı açısından önemi daha iyi anlaşılıyordu.Bundan ilave kitap boyunca sürekli kullanıcıya sorular sorularak hem kullanıcılarla etkili iletişim kurulmuş hem de okuyucunun dikkati canlı tutulmaya çalışılmıştır.Kitap boyunca sürekli iyi bir yazılımın nasıl olması gerektiği hakkında çeşitli bilgiler verilimiştir. İyi bir yazılımın iyi tasarlanmış,iyi kodlanmış kolayca değiştirilebilir, kolayca yeniden kullanılabilir ve kolayca yenilikler eklenebilir olması gerektiği kitap boyunca üstüne basıla basıla çeşitli örnek problemler de ortaya atılarak vurgulanmıştır. Kitapta vurgulanan bir diğer önemli nokta iyi yazılımın müşterinin isteğine uygun yapılmış olması gerektiğidir. Yazılım tasarlarken nesne yönelimli programlama tekniğini düzgün kullanmamızın yazılımı sonradan müşterinin yeni isteklerine göre değiştirmemiz istendiğinde kolayca değiştirebileceğimizi göstermek amacıyla örnek bir problem tanımlanmıştır. Bu problemde ailenin şöyle bir sorunu vardır; köpekleri her gece havlayarak dışarı çıkmak istemektedir ve aile üyeleri gece yataktan kalkarak kapıyı açmaktan bıkmıştır.Köpek havladığı zaman dışarı çıkmasına izin veren bir kapı sisteminin tasarlanması istenmiştir. Bunun için yazılımcılar aile üyelerinin gece yataktan kalkarak köpeğe kapıyı açmalarının karşısını almak amacıyla uzaktan kumanda sistemi kullanılarak havlama sesi duyulduğunda kapıyı uzaktan kumandayla açabilmeleri sağlanmış ve müşteriler gece yataktan kalkmak zorunda kalmadıkları için programdan memnun kalmışlardır. Belli bir süre programı kullandıktan sonra aile üyeleri yeni isteklerini yazılımcılarına bildirmişlerdir. Bu sefer müşteriler sürekli gece uyanarak uzaktan kumandaya basmaktan bıktıklarını belirtmiş ve havlama sesine duyarlı otomatik kapı tasarlanmasını istemişlerdir. Yazılıma köpek sesi tanıyıcı eklendikten sonra müşterilerin istediği yazılım onlara sunulmuştur. Müşteriler mutlu bir şekilde yazılımın yeni versiyonunu kullandıktan sonra yeni bir istekle tekrar yazılımcılara müracaat etmişlerdir. Bu sefer müşteriler köpek sesi tanıyıcının tüm köpeklerin sesine tepki vererek açıldığından yakınmış ve köpek sesi tanıyıcısının sadece onların köpeğinin sesine duyarlı olmasını istemişlerdir. Yazılımcılar bu sorunu da çözerek köpek sesi tanıyıcısının sadece kendi köpeklerinin sesine duyarlı olmasını sağlamışlardır. Kitapta tüm bu değişikliklerin nesne yönelimli programlama tekniği kullanılarak ne kadar rahat yapılabildiği vurgulanmış ve kod üzerinde gösterilmiştir.

1 Ekim 2010 Cuma

Futbol Menajerlik Sümulasyonu Projesi

C# la ilgili uygulama tecrübemi arttırmak için Futbol menajerlik simülasyonu yapmaya karar vermişdim. Bu projeyi yaparken iyi bir yazılım ortaya çıkarmak için izlenmesi gereken aşamaları izlemeye çalıştım. Tasarım ve analiz aşamasında programımda kullanacağım sınıflara ve metotlara, programın kullanıcı arayüzünün nasıl olması gerektiğine karar verdim. Oyuncu ve takım sınıflarını kullanmam gerektiğine karar verdim. Kullanıcı arayüzünde ise kullanıcıya 4 seçenek sunuluyordu, bunlar yeni oyun, oyuna devam et, oyun kuralları ve hakkımızda seçenekleriydi. Bunlardan sadece ilkini aktif etmişdim diğerleri sonradan eklenebilir. Kullanıcı yeni oyun seçeneğini seçtiğinde karşısına bir forum çıkıyor ve kullanıcının bu forumdaki tüm bilgileri eksiksiz doldurması bekleniyor. İstenen bilgiler ad, soyad, yaş, milliyet ve seçmek istediği takım bilgileriydi. Bu arayüzü tasarlarken textbox ve combobox gibi kontrollerden faydalanmayı öğrendim. Ayrıca kullanıcının kendi esmini de programa yüklemesi mümkün. Kullanıcı bilgileri doldurup kaydet tuşuna bastığında ise karşısına programın ana sayfası çıkıyor. Ana sayfada olaylara göre sürekli değişen haberler kısmı yer alıyor richtextbox kullanılarak tasarlanmıştır. Richtextbox’ın yanında ise picturebox kontrolü kullanılarak gazete resmi koyularak bu kısımda haberlerin yer aldığı mesajı kullanıcıya iletilmeye çalışılmıştır. Ana sayfada yer alan bir diğer öğe devam düğmesidir. Bu düğme kullanıcının her basışında bir sonraki maçın oynanmasını sağlıyor. Ana Sayfanın üst kısmında tabbed panel kontrolü kullanılarak diğer sayfalara geçişler yapma fırsatı sağlanmıştır. Toplam on iki sayfa bulunmaktadır. Bunlar ana sayfa,taktik, antrenman, maç, takvim, lig bilgisi, transfer, bütçe, stadyum, kupa bilgisi, haberler ve hakkımızda sayfalarıdır. Tüm sayfaların sağladığı özelliklerden kısaca bahsetmek istiyorum.
Taktik Sayfası: Bu sayfada kullanıcının takımının taktiğini ayarlayabiliyor. Taktiği ayarlamadan maç yapılamıyor bu nedenle maç yapabilmek için taktik ayarlanması zorunludur. Ayarlamak istemeyen kullanıcılar yardımcıya sor seçeneğini tıklayarak taktiğin otomatik olarak ayarlanmasını sağlayabilirler. Taktiği otomatik seç seçeneği dizilişi değiştirmez sadece esas ve yedek kadro için oyuncu seçimi yapar. Kullanıcı sürükle-bırak yöntemiyle takımın dizilişini istediği şekilde ayarlayabilir. Kullanıcı taktiği ayarladıktan sonra kaydet butonuna basarak taktiğin kaydedilmesini sağlar.
Antrenman Sayfası: Bu sayfada kullanıcıdan takımının antrenman ayarlarını yapması istenir. Kullanıcı takımının antrenman ağırlıklarını yatay scroll-bar yardımıyla ayarlar.Antrenman ağırlığı olarak 3 aşama bulunmaktadır hafif, orta ve ağır.
Maç Sayfası: Bu sayfa menajerin dostluk maçı ayarlaması içindir. Kullanıcıdan rakip takımı ve maçın oynanacağı stadı seçmesi istenir. Kullanıcı bu seçenekleri seçtikten sonra maç düğmesine tıklayarak maçın oynanmasını sağlar. Bu aşamada ilerde bahsedeceğim maç oynatma algoritması devreye girerek takımların güçlerine göre bir maç skoru ve gol atılmışsa, gol atan oyuncuların isimleri kullanıcıya gösterilir.
Takvim Sayfası: Kullanıcı bu sayfada takımının sezon boyunca yapacağı resmi maçların takvim bilgilerine ulaşabilir. Ayrıca daha önce yapılmış maçların da skorlarını görebilir.
Lig Bilgisi: Kullanıcı bu sayfada lig tablosunu görebilir. Lig tablosunda takımların yaptığı maç sayısı ‘O’, galibiyet sayısı ‘G’, beraberlik sayısı ‘B’ , mağlubiyet sayısı ‘M’ ,attığı gol sayısı ‘AG’, yediği gol sayısı ‘YG’, averajı ‘AVG’ ve puanı ‘P’ görülmektedir. Kullanıcı bu sayfada ayrıca gol krallığı yarışına da göz atabilmektedir.
Transferler Sayfası: Bu sayfa programın bu versiyonunda bitirilememiştir. Bu sayfada kullanıcının oyuncu transferlerinin gerçekleştirmesi planlanmaktadır ilerki versiyonlar için.
Bütçe Sayfası:  Programın bu versiyonunda bu sayfada takımın bütçesi yer almaktadır sadece. Stadium sekmesinde anlatılacak olan yeni koltuk ekleme sırasında yapılan harcamalar bu ekranda görülebilmektedir.
Stadyum Sayfası:  Bu sayfada kullanıcı kendi takımının stadyum kapasitesini arttırabilmektedir.
Kupa Bilgisi Sayfası: Bu sayfa programın bu versiyonunda tasarlanmamıştır. İlerki versiyonlar için bu sayfada takımın avrupa kupası bilgi ve istatistiklerinin görüntülenmesi planlanmaktadır.
Haberler Sayfası: Bu sayfada kullanıcının internet bağlantısı mevcut olduğu taktirde http://www.pfl.az sitesinin ana sayfası görüntülenir ve kullanıcının azerbaycan ligiyle ilgili en güncel haberlere erişmesi sağlanır.

Hakkımızda Sayfası: Kullanıcı bu sayfada oyunun geliştiricisi hakkında bilgiye ulaşabilir. Geliştiriciyle iletişime geçerek yorumlarını iletebilir. Bu sayfada ayrıca programın ilerki versiyonlarında yapılması planlanan değişiklikler yer almaktadır.

Programın maç yaptırma algoritması şu şekilde çalışmaktadır: Tüm oyuncuların bir savunma ve hucum gücü değeri bulunmaktadır. Takımların sahaya sürülen ilk on bir oyuncusunun hucum ve defans değerlerinin aritmetik ortamaları takımın hücum ve defans değeri olmaktadır. Bir takımın hücum değeri diğer takımın defans gücü değerinden ne kadar yüksekse takımın gol atma olasılığı artmaktadır. Ayrıca kendi sahasında oynayan takımların rakip takıma göre biraz daha avantajlı olması sağlanmaktadır.  Rakibine göre göstericileri çok düşük olan takımların bile gerçek hayatta kazanma olasılığı bulunduğu göz önüne alınarak az olasılıkla da olsa bu takımlara bir veya iki gol atma şansı tanınmıştır.

5 Ağustos 2010 Perşembe

JPA'da @version tagı kullanılarak optimistic locking mekanizmasının sağlanması

JPA'da @version tagı veritabanına birden çok kişinin aynı anda erişmesi durumunda  optimistic locking mekanizmasının kullanılmasını sağlar. Bir tabloda sadece bir tane version alanı olabilir. Normal şartlarda veritabanlarında optimistic veya pessimistic locking kullanılmadığında  birden çok kişi aynı anda veritabanina eriştiğinde birbirini ezme prensibi kullanılıyor yani en son yapılan değişiklik daha önceki değişiklikleri eziyor. Arkadaşımla yaptığımız denemelerde aynı anda  veritabanina eriştikten sonra önce ben değişiklik yapıp commitledim daha sonra arkadaşım değişiklik yapıp commitledi ve onun yaptığı değişiklik benim yaptığım değişikliği ezdi. Version alanı kullanarak yaptığımız denemelerde ise ben veritabanina eriştim ve bazı değişiklikler yaptım ve commitlemedim, daha sonra arkadaşım tabloya erişerek bazı değişiklikler yapmaya çalıştı ama sistem buna ben commit yapmadan izin vermedi.Sistem sadece veritabaninin o anki durumunu görmesine izin verdi.
Version alanının kullanılma mantığı şu şekildedir, kullanıcı veritabanında bir alana eriştiğinde version alanındaki değer kontrol ediliyor sistem tarafından ve kullanıcı herhangi bir değişikli yaptığı anda version alanındaki değer bir kez daha kontrol ediliyor ve eğer bu değer sisteme ilk girildiğinde kontrol edilen değere eşitse (bu değer veritabanında herhangi bir değişiklik yapıldığı zaman değişiyor.) o zaman kullanıcının değişiklik yapmasına izin veriliyor. Version alanındaki değer her değişiklik sonrası bir arttırılıyor.Eğer alana eriştiğimiz andaki version değeriyle değişiklik yaptığımız andaki version değeri farklıysa bu başka birinin bizim sisteme giriş yaptığımız ve değişiklik yaptığımız zaman arasında o alanda başka bir değişiklik yaptığını gösterir ve değişikli yapmamıza izin vermez.Version alanı timestamp( en son değişiklik yapılma tarihi ) veya numeric türde değişken kullanılabilir ama Oracle numeric değişkenlerin kullanılmasını öneriyor.çünkü time stamp değişkenler veritabanında %100 kesin değerleriyle tutulamaz ve neredeyse nano saniye farkla yapılan farklı commitler arasındaki farkı algılayamayabilir.

Not: Arkadaşım Anıl Mercana yardımlarından dolayı teşekkür ediyorum.

2 Ağustos 2010 Pazartesi

Interface ve Abstract

Head First Java (Second Edition) kitabında gerçekten çok güzel örnek verilmiş interface ve abstract arasındaki farkı anlamak için. Elimizde kedi,  köpek, aslan,  kaplan, suaygırı, kurt gibi hayvanlar var ve bunları belli bir hiyerarşiye göre dizmemiz gerekiyor daha sonra polimorfizm gibi yöntemlerden rahatça faydalanabilmemiz için. Öncelikle bütün bu elimizdeki canlıların hayvan olduğu bilindiğinden ve hepsinin yemek, uyumak, acıkmak gibi hayvanlara özgü ortak özellikleri bulunduğundan öncelikle Hayvan adında abstract bir sınıf oluşturuyoruz. Daha sonra kedi, kaplan ve aslan gibi hayvanlarda ortak özelliklere sahip olduklarından dolayı Kedigiller adında abstract bir sınıf oluşturuyoruz ve kedi, kaplan ve aslanı bu abstract sınıftan extend ediyoruz. Aynı şekilde köpek ve kurt da birçok ortak özelliğe sahip olduğundan bu hayvanların ortak özelliklerini barındıran canine(köpek ve benzeri hayvanlar) adında abstract bir sınıf oluşturuyoruz. Kurt ve köpeği canine sınıfından extend ettikden sonra suaygırını da direk hayvan adlı abstract sınıftan extend ediyoruz.

Daha sonra şöyle bir sorunla bizden evcil hayvanlara ait olan ‘oyna’ ve ‘sevimli ol’ gibi metodların kedi ve köpek gibi evcil hayvanlara dahil etmemiz isteniyor. Bunu yapmanın birçok yolu geliyor hemen aklımıza ilki hayvan adlı abstract sınıfın içerisine bunları abstract metodlar olarak dahil ederek tüm aly sınıflarda bu özelliklerin sağlanmasını garantiye almak. Ancak bu çözüm yolu nesne yönelimli programlamanın birçok prensibini altüst ediyor çünkü bu durumda aslan ve kaplan gibi hayvanlara da gövdesini doldurmasak bile sevimliol() oyna() gibi metodlara sahip olma imkanı sağlıyor. Bu durumda bu yöntemin sorunumuzu çözmediğini görüyoruz ve başka bir çözüm yolu aramaya devam ediyoruz.Bir başka çözüm yolu da kedi ve köpek gibi evcil hayvanlara ait olan sınıfların içine ayrı ayrı evcil hayvanlara ait metodları yazmak olabilir. Ancak bu durumda da polimorfizm gibi bir özelliği kullanmaktan mahrum oluyoruz. Ayrıca aynı işlevi yapmak için yazılmış metodlar farklı isimlerde olabilir örneğin kedi için sevimliOl() adını verdiğimiz metodun karşılığı köpek içerisinde tatlıOl() şeklinde olabilir bu da çeşitli karışıklıklara neden olur.

Bu sorunu çözecek en iyi çözem yolu çoklu kalıtımdır! Ancak Java çoklu kalıtım çok fazla karışıklık yarattığından dolayı desteklemez. Peki bu durumda ne yapmamız gerekiyor?
İşte bu durumda imdadımıza Interface yetişiyor çünkü javada bir sınıfı birden çok abstract sınıftan extend edemeyiz ancak birçok interfaceden implemente edebiliriz. Ayrıca bir sınıfı bir abstract sınıftan ve bir veya birden çok interfaceden implemente etme şansımız da vardır.
Sorunumuza dönersek, Pet adında bir interface yazarız ve bu interface’in içerisinde sevimliOl() oyna() gibi gövdesi boş metodlar tanımlarız(interfacelerde içi dolu metodlar tanımlayamıyoruz sadece içi boş metodlar tanımlayabiliriz. İşte bu yüzden java abstract sınıflarla çoklu kalıtım yapmamıza izin vermediği halde interfacelerle çoklu kalıtım yapmamıza imkan sağlıyor. ). Daha sonra kedi ve köpek gibi evcil hayvanları hayvan sınıfından extend ve pet interface’den implement ederiz. Böylece nesne yönelimli programlamanın polimorfizm gibi çok değerli özelliklerinden faydalanabileceğiz.

15 Temmuz 2010 Perşembe

Nesne Yönelimli Programlama Temel Kavramlar

Nesne Yönelimli Programlama Kavramları 

- Kalıtım, Polimorfizm, Compositon
- Temel OOP Terimlerinin Anlaşılması (is-a ve has-a ikişkileri)
- OOP Mimarilerinin Başarısı
- Nesne ve Sınıf Kavramları

Nesne Yönelimli Programlama Prensipleri

- Single Responsibility Principle
- Open Closed Principle
- Liskov Substitution Principle
- Dependency Inversion Principle
- Interface Segregation Principle
- Reuse Release Equivalency Principle
- Common Closure Principle
- Common Reuse Principle
- Acyclic Dependencies Principle
- Stable Dependencies Principle- Stable Abstractions Principle

Nesne Yönelimli Programlamanın Temel İlkeleri
Veri Gizleme
Sınıf ve Nesne
Yordamlar ve İletiler
Çokbiçimlilik
Arayüz Oluşturma
Türetme ve Çokbiçimlilik
Erişim denetimi
Liskov Yerine Geçme İlkesi - LSP (Liskov Substitution Principle)
Açık Kapalı İlkesi - OCP (Open-Closed Principle)
Bağımlılık Ters Çevirme İlkesi - DIP (Dependency Inversion Principle)
Arayüz Ayırma İlkesi – ISP (The Interface Segregation Principle)
Sürüm Yeniden Kullanımı Eşdeğerlik İlkesi – REP (The Release Reuse Equivalency Principle)
Ortak Kapatma İlkesi – CCP (The Common Closure Principle)
Ortak Yeniden Kullanım İlkesi – CRP (The Common Reuse Principle)
Çevrimsiz Bağımlılık İlkesi – (ADP) (The Acyclic Dependencies Principle)
Kararlı Soyutlamalar İlkesi – SAP (The Stable Abstractions Principle)
Kararlı Bağımlılıklar İlkesi – (SDP) (The Stable Dependencies Principle)

Tasarım Kalıpları

Aynı problemler sürekli bir yazılımcının karşısına farklı farklı zamanlarda çıkmaktadır ve bu sorunlara aynı çözümler üretilebilmektedir. Bu noktada tasarım kalıplarına ihtiyaç duyulmaya başlanmıştır çünkü tasarım kalıpları hem aynı problemi tekrar tekrar çözmemizin önüne geçer hem de bir sorun için üretilebilinecek en optimal çözümü kullanmamızı sağlar. Bu ayrıca programımızda hata çıkma olasılığını da azaltır ve daha güçlü bir kod yazmamızı sağlar. Bu ayrıca yazılımın en önemli prensiplerinden biri olan yeniden kullanılabilirlilik kavramını da destekler.

Tasarım Kalıpları’nın Dünyadaki Genel Tanımlanma Biçimi
İsim: Her kalıbın genel olarak tek bir adı vardır ve bu ad başka bir kalıpta kullanılamaz
Amaç: Kalıbın amacı
Problem: Kalıbın çözdüğü problem
Çözüm: Kalıp probleme nasıl bir çözüm yaklaşımı getirmektedir?
Birimler: Kalıpta kullanılan birimler.(UML gösterimi ile birlikte)
Gerçekleştirim: Kalıbın kodları

Genel olarak  tasarım kalıpları programlama dillerinden bağımsız olarak tanımlansalar da, nesneye yönelimli programlama dillerine uygun tasarım kalıpları daha çok bilinir. Bu kalıplar, nesneler ve sınıflar arasındaki ilişkileri ve etkilişimleri gösterirler. Programcı bir tasarım kalıbını elindeki soruna bakarak özelleştirip kullanabilir.


Bu kalıpları uygulayabilmek için kulanılması gereken prensipler

Açık Kapalı Prensibi (Open Closed Principle)

Yazılmış bir modülün genişlemeye açık ama değişikliğe kapalı olması gerekliliğini vurgular. Yani yazılan kod üzerine bir eklenti yapılmak istendiğinde önceden yazılmış kodlarda değişiklik gerekliliği olmamalıdır. Gerekli eklentiler sadece eklenti için gereken yeni özelliğin kodlanması ile sonuçlanmalıdır.

Liskov Ayrışabilme Prensibi (Liskov Substitution Principle)

"Türemiş sınıflar, türedikleri temel sınıfların yerini herhangi bir problem çıkmadan alabilmelidir." prensibidir. Yani temel sınıftan yaratılmış bir nesneyi kullanan bir fonksiyon, temel sınıf yerine bu temel sınıftan türemiş bir sınıftan yaratılmış bir nesneyi de aynı yerde kullanabilmelidir.

Bağımlılığın Azaltılması Prensibi (Dependency Inversion Principle)

Kullanıcı ile sınıflar arasındaki ilişkinin olabildiğince soyutlanmış yapılar üzerinden yapılmasını önerir. Yani tasarımda ilişkilerin gerçek sınıflardan türemiş nesneler ile değil, ilgili arayüzler(interface) ve soyut sınıflar kullanılarak gerçeklenmesi gerekir.

Tek Sorumluluk Prensibi (Single Responsibility Principle)

"Bir sınıf sadece tek bir sorumluluğu yerine getirmelidir ve yerine getirdiği sorumluluğu iyi yapmalıdır." prensibidir. Her sınıf sadece kendisi ile ilgili tek bir sorumluluğu yerine getirir. Her sınıfın sorumluluğu farklı olduğu zaman, değişmesi için tek bir sebep olur,o da ihtiyaçların değişmesidir. Sınıfların birden fazla sorumluluğunun olması bağımlılığın artmasına neden olur.

Arayüz Ayırma Prensibi (Interface Segregation Principle)

Kullanılacak methodların ve özelliklerin gruplandırılarak her biri ayrı işlevi tanımlayan farklı arayüzlere bölünmesini savunur. Sonuç olarak, bir sınıfın kullanmadığı method ve özellikler programın içeriğine alınmamış olur.

Tasarım kalıplarını inceleyecek olursak temelde 3 ana gruba ayırabiliriz:

Yaratılış Kalıpları (Creational Patterns): Nesnelerin nasıl yaratılacağı hakkında alternatifler sunar. Farklı durumlarda yaratılması gereken nesnelere karar verir.

Yapısal Kalıplar (Structural Patterns): Nesneleri ve sınıfları birleştirerek karmaşık kullanıcı arayüzleri gibi daha geniş yapılar oluşturur.

Davranışsal Kalıplar (Behavioral Patterns): Nesne grupları arasındaki iletişimin tanımlanmasında kullanılır ve daha karmaşık programlarda akış kontrolünü sağlar. Nesnelere işlevsel sorumluluklarını atar.

Tasarım kalıplarının listesi:

Davranışsal Kalıplar
Chain of responsibility
Command
Interpreter
Iterator
Mediator
Memento
Observer
State
Strategy
Template method
Visitor

Yapısal Kalıplar
Adapter
Bridge
Composite
Decorator
Facade
Flyweight
Proxy

Yaratılış Kalıpları

Abstract Factory
Builder
Factory Method
Prototype



 

Javada class içerisinde 'static' kullanımı.

Javada metodları static yaptığımız zaman bu bize instance yaratmadan o metodu kullanmamızı sağlar. Aynı şekilde bu değişkenler için de geçerli, sınıf içinde bir değişkenin static olması bizim bu değişkene instance yaratmadan erişmemizi sağlar. 
Örneğin:
       public class Araba{
              public static int a;
              public int b;
       }

Araba.a //diyerek a değerine erişebiliriz ancak aynı şekilde Araba.b diyerek b değişkenine erişmemiz mümkün değil. Bunun için bir instance yaratmamız gereklidir.
Araba bmw=new Araba();
bmw.b //diyerek b değişkenine erişebiliriz.

Static metodlara örnek olarak da aşağıdaki örneği verebiliriz

public class Araba {

      static void hiz1()
      {
             System.out.println("hiz1 kullanılıyor");
      }

      void hiz2()
      {
             System.out.println("hiz2 kullanılıyor");
      }
}

//Main içerisinde Araba.hiz1() diyerek hiz1 metoduna instance yaratmadan erişebiliriz ancak hiz2'ye aynı şekilde erişmemiz mümkün değil.

İnner classlar için durum biraz farklıdır. Bir inner class'ı static yapsak da yapmasak da bu class'a instance yaratmadan erişebiliriz. Örneğin:

public class Araba {

      public class Teker1{

      }

      public static class Teker2{

       }
}

Araba.Teker1 ve Araba.Teker2 diyerek her iki class'a erişebiliriz.

Not: Static metodların içerisinde static olmayan değişkenler kullanamayız. Bunun nedeni static olarak tanımlanan herşeyin ilk olarak oluşturulmasıdır. Bu nedenle static bir metodun içerisinde static olmayan bir değişken kullanmaya çalıştığımız zaman o değişken henüz oluşturulmadığından derleyici hata mesajı verecektir.

9 Temmuz 2010 Cuma

Javada Interface ve Abstract Classlar Arasındaki Farklar

  • Interfaceler çoklu kalıtımı sağlamaya yardımcı abstract classlar ise çoklu kalıtımı desteklemez.
  • Interfacelerde metodların içerisini dolduramayız ama abstract classlarda doldurabiliriz Böylece bütün alt sınıfların belli bir özelliğe sahip olmasını sağlayabiliriz.
  • Interface ile yapabildiğimiz herşeyi hatta daha fazlasını abstract classlar ile de yapabiliriz.
  • Eğer türeteceğimiz classlarda belli başlı varsayılan özellikleri tekrar tekrar kopyala-yapıştır yapmak istemiyorsak o zaman abstract class kullanmamız gerekir. Çünkü abstract classlarla bir metodu tüm alt classlarda varsayılan metod şeklinde tanımlayabiliriz ve alt classlarda bunları tekrar yazmamıza gerek kalmaz kalıtımla aktarılmış olur.
  • Kalıtım sağlamak istiyorsak abstract classlar kullanmamız gerekir.
  • Abstract classları kullanmak hız açısından avantaj sağlar.
  • Interface de yeni bir metod yazdığımız zaman bu interfaceden implement ettiğimiz tüm classlarda bu metodun içini tek tek doldurmak gerekiyor ancak abstract classlarda durum farklıdır burada bir metod tanımlayıp içini doldurduğumuzda abstract sınıfımızdan türetilmiş bütün sınıflar bu özelliği kazanmış olur. 

8 Temmuz 2010 Perşembe

Java'da Interface Kullanılmasının Nedenleri

Java da interface kullanmamızın en büyük nedeni interfaceden türetilecek sınıflar için bir standart(zorunluluk da diyebiliriz) belirlemektir. Örneğin Telefon adında bir interface üretiyoruz ve  daha sonra interfaceden sınıflar implement ediyoruz. Bütün bu sınıfların bazı ortak özelliklere sahip olmasını bir zorunluluk haline getirebiliyoruz. Örneğin interfacede  arama() adında bir metod yazıyoruz ( içini boş bırakmak zorundayız interfacelerde) ve türetilecek bütün sınıflar kendi özelliklerine uygun olarak arama() metodunu dolduruyor. Böylece bütün telefonların arama özelliğine sahip olmasını bir standart haline getirmiş oluyoruz. 

Veritabanıyla ilgili bir örnek de vermek istiyorum. Örneğin çok geniş bir yazılım yazdığımızı varsayalım. Kullanıcıya bir veritabanı seçtirip buna göre işlemler yaptırmak istiyoruz. O zaman kodumuzda şöyle  satırlar olacaktır:
if(secim=="MySQL")
Veritabani vt =new MySQL();
if(secim=="ORACLE")
IVeritabani vt = new ORACLE();

.... bir kaç tane daha olabilir...

Daha sonra..  vt.baglan()  diyerek baglantimizi sagliyoruz.
Biz daha önce veritabanlarini tek bir Veritabani adlı interfaceden implement etmiştik ve orada baglan() adinda bir metod tanımlayarak içini boş bırakmnıştık ve tüm veritabanlarinin içine kendi özelliklerine uygun olarak baglan() metodunu farklı şekillerde tanımlamıştık.
Böylece hepsinde baglan() metodunun olmasını garanti etmiştik.

Eğer böyle yapmasaydık mesela mySQL için vt.connect() yazmamiz gerekirdi ve bu kodumuzda gereksiz uzamalara neden olabilirdi. Interfaceyle bunun önüne geçmiş oluyoruz.

9 Mayıs 2010 Pazar

Project Eular En İyi 19 Azerbaycanlı

Project Eular Reyting (son 25 soruya bağlı)

projecteuler.net Matematik/Bilgisayar Problemleri

Gerçekten güzel problemlere rastladım algoritma problemleri çözmeyi sevenler için mükemmel bir site. Bu sorularda matematik yeteneğinin yanı sıra programlama yeteneğinin de devreye girmesi gerekiyor. Çünkü mesele 1001 ci asal sayıyı bulun diyor bunu sadece matematik bilgisiyle bulmak zor ama kısa bir kodla bir kaç dakikada rahatlıkla bulunabilir.
Güzel bir site sürekli takip etmeyi planlıyorum.

26 Şubat 2010 Cuma

Google da üst sıralarda çıkmak için yaptığım çalışmalardan edindiğim tecrübeler. (Bölüm 1)

Bu yazımda sizlere google da üst sıralarda çıkma çalışması yaparken edindiğim tecrübeleri anlatmak istiyorum. Google da üst sıralarda çıkmak gerçekten çok kapsamlı bir çalışma gerektiriyor. Google da üst sıralarda çıkmak ve arama motorloruna dost siteler oluşturmak için yapılan çalışmaların tümüne SEO (search engine optimization –arama motoru optimizasyonu )  denilmektedir. Seo çalışmaları yaparken öncelikle unutmamanız gereken en önemli konu siteyi arama motorları için ziyaretçiler için yaptığınızı unutmamanızdır. Öncelikle hedef kitlenizi iyi tanımanız gerekiyor ve onların sizin verdiğiniz hizmete ulaşmak için google da yazacağı kelimeleri iyi tahmin etmeniz gerekiyor ve sitede bu kelimeleri bolca kullanmanız gerekiyor. Ayrıca değişik variyasyonlar da iyi tahmin edilerek google da kullanıcıların sizin verdiğiniz hizmetle ilgili yazabileceği en yaygın kelimeleri de sitede geçirilmeye çalışılmalıdır. Tabiki kelime geçirme işlemini yaparken sırf kullanmış olabilmek için olur olmaz yerlerde bu kelimeleri kullanarak sitenin kalitesini düşürmek yerine alanınızla ilgili bolva makale yazarak kullanıcıları sıkmamak en iyi yöntemdir.

Domain isminizi seçerken iyi düşünmek gerekiyor. Şirketinizin sitesi elbette ki şirketinizin adıyla ilgili olmalıdır. Örneğin Bir lazer epilasyon merkezinin sitesini yapacaksanız ve şirketinizin ismi “Örnek Şirket”se domaininizin www.orneksirket.com olması mantıklıdır. Ancak böyle bir alan adı kullandığınız takdirde www.lazerepilasyon.com gibi bir alan adı kullanmadığınız için google açısından domain de önemli kelimelerin gecme avantajını kaybediyorsunuz. Bu konuda benim fikrim iki ayrı site kurulmasıdır  www.lazerepilasyon.com ve www.orneksirket.com . Böylece şirketinizle ilgili temel bilgilere ve kampanyalara yer vereceğiniz şirket siteniz sizin kurumsal kimliğinizi vurgulayacak ve fazladan bilgilere yer verilmeyerek sitenin profesiyonelliği en iyi şekilde yansıtılacaktır. Ancak böyle bir sitenin googleda üst sıralarda çıkma olasılığı düşmektedir. Bu nedenle ayrıca şirket sitenizden farklı olarak burada title , keywords, description , content gibi özellikler çok daha etkili kullanılabilir, böylece google da üst sıralarda çıkma olasılığınız yükselecktir. Bu yazıyı burada sonlandırıyorum 2. Bölümde görüşmek üzere.

22 Şubat 2010 Pazartesi

Facebook forumların yerini almalı !

Hem kullanıcılarırın daha once kullanmaya aşina oldukları bir şeyi yadırgamayacaklarından. Hem de facebook inanılmaz bir kullanıcı kitlesine sahip olmasından dolayı  artık sitelerde forum kurulup herhangi bir konuda bilgi alış verişi, sohbet ortamı yaratmak yerine web tasarımcıların ve seo uzmanlarının  Facebook Gruplarını tercih etmelerini daha doğru buluyorum. Çünkü sitenize giriş yapmış ziyaretçiler çoğu forumlara aşina olmayan ziyaretçilerdir genellikle. (Burada kesinlikle forum sitelerinden bahsetmiyorum. İçinde forum sayfası da kullanarak sohbet ve bilgi alışverişi yaratmak isteyen sitelerden bahsediyorum) Sitede forum kullanmak yerine facebook gruplarını kullandığınız takdirdeyse forumla ulaşmak istediğiniz hedefe daha kolay ulaşacaksınız. Çünkü Türkiyede hemen hemen herkesin bir facebook hesabı var ve insanlar facebookla bağlı konularda artık uzmanlaşmış durumdalar. Örnek olarak son tasarladığım Big Kitchen Cafe ve Restaurantlar zincirini örnek göstermek istiyorum. Burada forum yerine facebook grubu tercih ettim ve sanırsam başarılı oldum. Bahsettiğim şeylerr. Sitelerdeki ziyaretçi defteri ve fotğraf galerisi gibi sayfaların yerine de kullanılırsa başarıya ulaşılacağına inanıyorum. Ayrıca Facebook'ta grubun yayılmasının ihtimali çok daha büyük potansiyele sahip olduğu tartışılmaz bir konu.

9 Şubat 2010 Salı

Azerbaycan'ın EURO 2012 Grubu

İnanıyorum ki bu grupta güzel bir sürpriz yapabiliriz. Gruptan çıkma hedefi imkansız gibi gorunuyor ama en azından grupta iyi bir sıralama elde edebilmemiz için Kazakistandan 6 puan almamız gerekiyor. Avusturya ve Belçikadan da puan almak hayal değil. Türkiyeden de en az 1 puan alabiliriz. Türkiye genellikle Azerbaycan gibi takımları küçümsüyor bu nedenle hep gereksiz puan kayıpları yapıyor. Medyadyada yine aynı şekilde bir küçümseme havası sezdim. Unutmamalıyız ki maçlar sahada kazanılıyor. Almanyadan puan almak hayal gibi gorunuyor şu an için. Azerbaycan millisi Almanyadan puan alırsa büyük sansasyon olur. Cavadov Twente'ye geçtikten sonra özgüveni daha da arttı bu en büyük avantajımız. Kalecimiz Kamran Ağayev çok iyi gerçekten müthiş kurtarışlar yapıyor. Ruslan Abışov ve Mahir Şükürov kendilerini geliştirdiler. 
Berti Fogts çok iyi bir teknik direktör altyapıya önem vererek gerçekten de iyi işler yapıyor. İnşallah 2014 dünya kupası elemelerinde artık gruptan çıkma konusunda konuşacağız!