Static metotlar hangi durumlarda kullanılmalıdır?

soruldu: 08 Eki, 03:05

caylakmuhendis's gravatar image

caylakmuhendis
02
cevap kabul oranı: 0%


Belli sınırları olmamakla birlikte yaygın olarak kullanıldığı bazı durumlar var.

  • Uygulamanın global olarak kullandığı kaynaklar, özellikler, konfigürasyon değişkenleri ve rutinler genelde static olarak tanımlanır.
  • Sınıflarda herhangi bir nesneye bağımlı olmayan rutinler static olarak tanımlanır. Örneğin, çoğu dilde implemente edilmiş olan Math sınıfı static tanımlanmıştır. Metodları sorduğunuz için Math sınıfının abs() metodunu ele alalım. Bu metod verilen sayının pozitif halini geri döndürür, burda döndürülen sonuç Math sınıfına veya herhangi başka bir duruma göre değişkenlik göstermez. Bu yüzden static kullanılması makuldür.

Örneğin bir uygulamanız var, serialden komutlar okuyorsunuz, bu komutların bilgisini bir sınıfla wrap edip listeye dolduruyorsunuz daha sonra da kaynak durumuna göre listeden alıp komutları işliyorsunuz. Burda kullandığınız makinenin işleyebileceği maksimum 100 komut limiti varsa, burdaki listenin eleman limitini(bufferSize diyelim) genelde static olarak tanımlarım.

Uygulama içinde heryerden kullanılacak yaygın, genel rutinler varsa bunları da genelde static tanımlarım. Aslında bakarsanız static tanımlamalar yerine dependency injection yapılarak sınıflara bağımlı oldukları nesneler inject edilebiliyor hatta nesne tabanlı tasarım için dependency injectionı daha çok tercih ediyorlar ama heryerde lazım olan nesneleri her sınıfa inject edince bence sınıflar biraz karmaşıklaşıyor, ben o yüzden bazı durumlarda static tanımlamaları tercih ediyorum. Herneyse teorik anlattım, ben bahsettiğim örneğin kodunu yazayım.

/* Listeyle ilgili komutlar herhangi bir dile özgü değil, kavramsal olarak anlaşılması için yazdım*/
public class AppConfiguration{
      public static int SerialBufferSize = 100;            //Listenin buffer sizeını beliriler.
}

//Uygulama boyunca kullanılacak yaygın rutinler
public class CommonRoutins{
      public static bool appIsFocused();                    // Focusun uygulamada olup olmadığını döndürür
      public static List<SerialPortInfo> listSerialPorts(); //Seri portları listeler.
      public static bool runAsDaemon(bool asDaemon);       //Uygulamayı arka planda çalıştırır veya öne alır
}

 public class SerialLink{
       private List<Command> commands;
       public void setBufferSize(int bufferSize){
            commands.setCapacity(bufferSize);
       }
 }

 int main(){
     SerialLink link = new SerialLink();
     link.setBufferSize(AppConfiguration.SerialBufferSize);
 }

Yanlız şunu da belirteyim, burda benim yaptığım static tanımlamalar tamamen benim tercihim, illa böyle tanımlanması gerekir diye bir durum yok. Geliştiricinin ihtiyacına veya tercihine kalmış bir durum. OO mimarilerde genelde static yerine singleton patternı tercih ediyorlar ona da bir göz atabilirsiniz.

permanent link

cevaplandı: 08 Eki, 04:45

ArnesTwin's gravatar image

ArnesTwin
1.1k1511
cevap kabul oranı: 14%

değiştirildi: 08 Eki, 04:47

Teşekkür ederim açıklamanız için

(08 Eki, 09:36) caylakmuhendis caylakmuhendis's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×13
×7

Soruldu: 08 Eki, 03:05

Görüntüleme: 138 kez

Son güncelleme: 08 Eki, 09:36

powered by BitNami OSQA