Programlamada sık sık böyle bir karışıklık yaşarız, bazı fonksiyonlar tekli yöntemlerle, bazı fonksiyonlar ise statik yöntemlerle çözülür, peki statik yöntemler ve tekllerin prensipleri ve kullanım senaryoları nelerdir? Bugün bunu netleştirelim.
1. Öncelikle statik yöntemler ile statik olmayan yöntemler arasındaki farka bakalım?
Birçok programcı, statik yöntemlerin önce yüklendiğini, statik olmayan yöntemlerin daha sonra yüklendiğini, statik yöntemlerin her zaman bellekte bulunacağını, statik olmayan yöntemlerin ise olmayacağını böyle bir anlayışa sahiptir. Bu nedenle, statik olmayan bir yöntemin kullanılması önerilir. Öncelikle, bu anlayışın yanlış olduğunu vurgulamak yanlıştır.
Öncelikle, uygulama başlatıldığında, CLR (CLR Ortak Dil Çalışma Zamanıdır) aynı zamanda Java sanal makinesi gibi bir çalışma zamanı ortamıdır; kaynak yönetiminden (bellek tahsisi ve çöp toplama vb.) sorumludur ve uygulama ile temel işletim sistemi arasında gerekli ayrımı sağlar. CLR'nin iki farklı çeviri adı vardır: Ortak Dil Çalışma Zamanı ve Ortak Dil Çalışma Zamanı. Süreçteki mevcut alanda, yönetilen yığın olan her sürece bir adres alanı tahsis eder. Yönetilen heap, birden fazla bölgeye ayrılmıştır; bunların en önemlileri çöp toplama yığını (GC Yığını) ve nesne örneklerini depolamak için kullanılan ve GC tarafından yönetilen yükleyici yığınıdır (Loader Heap). Loader Heap'in MethodTable tablosu aracılığıyla depoladığı en önemli bilgiler, temel tipler, statik alanlar, uygulama arayüzleri ve tüm yöntemler gibi meta veri ile ilgili bilgilerdir. Loader Heap GC kontrolünü kabul etmez ve yaşam döngüsü yaratılıştan yok oluşa kadar uzanır. Başka bir deyişle, bir sınıf yüklendikten sonra, bu sınıfın hem statik hem de statik olmayan yöntemleri Load Heap'in MethodTab tablosunda GC kontrolü olmadan saklanır ve hepsi ilk yük için bellekte bulunur.
Statik yöntem ile statik olmayan yöntem arasındaki fark nedir? Fark şu ki, bir nesne oluşturulurken statik yöntemin sadece bir kopyası olurken, statik olmayan yöntem her yeni nesne için bu örnekle ilgili bilginin bir kopyasını GC Heap'te kopyalayacak ve aynı zamanda yeni nesneyi yığına koyacaktır. Stack işaretçisinin işaret ettiği adres, GC Heap'e yeni kopyalanmış bellek adresidir. Bu nedenle, metod çağrı hızı açısından statik yöntemler daha hızlıdır çünkü statik olmayan yöntemler oluşturulup bellek tahsis edilmelidir.
Programlama tarihi açısından bakıldığında, erken yapılandırılmış programlamanın neredeyse tüm yöntemleri statik yöntemlerdi ve örnekleme yöntemlerinin tanıtımı nesne yönelimli programlama meselesiydi, bu nedenle örnekleme yöntemi verimlilik ve bellek sorununu çözmek için değildi. Geliştirmeyi daha desenli ve nesne odaklı hale getirmektir.
Yukarıdaki analizden şu sonuca çıkarılabilir: 1. Statik yöntem ve statik olmayan yöntem, çözüm modu arasındaki ayrımdır. 2. Eğer kalıtım, polimorfizm veya bir metodun sınıfının nesnesiyle hiçbir ilgisi yoksa, statik bir yöntem seçmelisiniz, örneğin bir araç sınıfı.
2. Singleton mod ile statik yöntem arasındaki fark nedir?
Bazen mühendislikte bir bilgiyi korumamız gerekir; örneğin, çalışma zamanında yüklenen bazı yapılandırma özellikleri, uygulamanın ömrü boyunca var olması ve kamuya açık olması gerektiği için sadece bir kopyaya ihtiyaç vardır. Bu aşamada, bu veriyi korumak için tekli veya statik bir yöntem kullanmayı düşüneceğiz, ancak bu zaman bu veriler nesne yönelimli bir şekilde elde edildiğinde tekli bir yöntem kullanacağız.
Birincisi, statik yöntemler sınıf tabanlıdır ve tekller nesne tabanlıdır. Çözünürlük deseni nesne tabanlıysa, singleton kullanın, aksi takdirde statik bir yaklaşım kullanın. Örneğin, singletonları kullanmak için sınıfları miras almalısı, arayüzleri uygulamalısı, başlatmayı geciktirmesi, ana sınıfları yeniden yazması vb. gerekir; ikincisi, statik yöntemler süreç odaklı, singletonlar ise nesne odaklıdır. Üçüncü olarak, statik özellik değişkenleri GC tarafından temizlenmeyecek, bu yüzden tekli nesneler GC tarafından temizlenmez ve statik yöntemlerle oluşturulan nesneler statik yöntem yürütüldüğünde serbest bırakılır. |