Elbette programın tasarım karmaşıklığına (complexity) bağlı olarak kod yoğunluğu değişebilir veya artabilir. Bazı geliştiriciler, her sınıf içerisinde ki her bir metot yada fonksiyon için ortalama satır sayısı kıyaslama analizi (benchmark) yaptığını biliyorum.

Merak ettiğim şey,

Ortalama düzeyde geliştirilen bir Java programı tüm görevlerini/algoritmasını bir veya iki sınıf ile yapabiliyorken, yerine, sınıf sayısı ve/veya metot sayısını artırarak aynı amaca yönelik bir program tasarımı yapmak, programın derleme sürecini (compile time) ve çalışma zamanını (runtime) ne yönde etkiler?

Miras (inheritance) ve Çok Biçimlilik (polymorphism) prensiplerinin, eğer varsa, böyle bir karışıklığa karşı etkili bir yöntemdir denebilmeli midir?

Derlenen sınıflardan oluşturulan .class dosyaları hafıza yönetiminde bir yığılma veya olumsuz bir etkiye mahal vermesi ihtimali üzerinde de görüşlerinizi almak isterim.

Saygılar.

soruldu: 25 Eyl '14, 19:15

cagcak's gravatar image

cagcak
16271320
cevap kabul oranı: 25%

değiştirildi: 26 Eyl '14, 04:50

%C3%B6zcanacar's gravatar image

özcanacar ♦♦
17.2k59183183


Ortalama düzeyde geliştirilen bir Java programı tüm görevlerini/algoritmasını bir veya iki sınıf ile yapabiliyorken, yerine, sınıf sayısı ve/veya metot sayısını artırarak aynı amaca yönelik bir program tasarımı yapmak...

Bu durumda nesneye yönelik programlama yapmak icin tasarlanmis Java dilini C dilinde oldugu gibi fonksiyon kolleksiyonlari ihtiva eden kod birimleri olusturmak icin kullanmis olursunuz ki bunun icin Java dilini kullanmak zorunda degilsiniz. Siniflari gövdesinde sadece fonksiyon barindiran yapilar olarak görmemek lazim. Siniflar nesneleri olusturmak icin kullanilan sablonlardir. Her nesnenin kendine ait bir ic dünyasi (state) ve dis dünya ile mesajlasmak icin kullandigi metotlari vardir.

Nesneye yönelik programlama yapilabilen dillerde siniflar yapilandirilirken tek sorumluluk prensibi takip edilmelidir (bknz link1, link2). Bu prensipten ne kadar uzaklasirsaniz, kodunu bakimi ve gelistirilmesi o kadar zorlasir.

sınıf sayısı ve/veya metot sayısını artırarak aynı amaca yönelik bir program tasarımı yapmak, programın derleme sürecini (compile time) ve çalışma zamanını (runtime) ne yönde etkiler?

Java'da daha fazla sinifin olmasi derleme süresini uzatabilir, lakin bu az sinif olusturma yönünde gecerli bir argüman olamaz. Uygulama calisirken siniflar sinif yükleyicileri tarafindan (class loader) hafizaya yüklenir. Cok fazla sinifinizin oldugunu uygulama calisirken ya da siniflar yüklenirken farketmezsiniz. Sadece daha fazla hafiza alanina ihtiyaciniz olur ki bu da megabytelarla ölcülen hafiza alani ihtiyacidir.

Miras (inheritance) ve Çok Biçimlilik (polymorphism) prensiplerinin, eğer varsa, böyle bir karışıklığa karşı etkili bir yöntemdir denebilmeli midir?

Miras bakimi, gelistirilmesi ve test edilmesi zor kod birimlerinin olusmasini destekler. Bunun yerine kompozisyon kullanilmalidir. Burada test edilebilir tasarim hakkinda bir yazim mevcut. Polomorfik yapilar kompleksiteyi artirmakla birlikte, uygulamanin kapali acik prensibine göre degisiklige ugramadan, genisletilebilir yapida olmalarini saglarlar.

Derlenen sınıflardan oluşturulan .class dosyaları hafıza yönetiminde bir yığılma veya olumsuz bir etkiye mahal vermesi ihtimali üzerinde de görüşlerinizi almak isterim.

Java 7 ye kadar Java hafiza alani (heap) old generation, eden generation ve permanent generation bölümlerinden olusuyordu. Siniflar permanent generation icinde yer alirlar. Cok fazla sinifiniz varsa, permanent generation alani icin daha fazla hafiza alani tahsis etmeniz gerekir. Bunun haricinde siniflarin hafiza yönetimi (garbage collection) üzerinde olumsuz bir etkileri olmaz, cünkü gercek nesnelerden ayridirlar. Java 8 ile G1 garbage collection yönetimi geldi ve saymis oldugum heap dagilimi kaldirildi. Artik siniflarda ana hafiza alanina yer aliyorlar. Bunun performansi nasil etkilediginin incelenmesi gerekiyor.

permanent link

cevaplandı: 26 Eyl '14, 04:50

%C3%B6zcanacar's gravatar image

özcanacar ♦♦
17.2k59183183
cevap kabul oranı: 52%

Cok fazla sinifinizin oldugunu uygulama calisirken ya da siniflar yüklenirken farketmezsiniz. Sadece daha fazla hafiza alanina ihtiyaciniz olur ki bu da megabytelarla ölcülen hafiza alani ihtiyacidir.

İfadeniz asıl almak istediğim görüş oldu. Bunu;

Cok fazla sinifiniz varsa, permanent generation alani icin daha fazla hafiza alani tahsis etmeniz gerekir. Bunun haricinde siniflarin hafiza yönetimi (garbage collection) üzerinde olumsuz bir etkileri olmaz, cünkü gercek nesnelerden ayridirlar.

ile güzel açıkladınız, teşekkürler.

Saygılar.

(29 Eyl '14, 06:54) cagcak cagcak's gravatar image
-1

Bu soruya en iyi cevabı Algoritma Analizi ve Tasarım Şablonları konularında bulabilirsin.

  1. Algoritma analizi: http://fef.ogu.edu.tr/matbil/aaslan/2.pdf
  2. Tasarım şablonları: http://www.kurumsaljava.com/yazilim-metotlari/tasarim-sablonlari/

Son olarak da şunu söylemek istiyorum. Bir problemi çözmenin en iyi yolu "böl ve zaptet" yöntemidir. Yani ne kadar çok parçaya ayırırsan geliştirmesi de o kadar kolay olur. Design Pattern'lara uyduğun zaman da karmaşıklık diye bir problemin olmaz. Karmaşıklık spagetti kod yazdığın zaman ortaya çıkar. Problem çözmek az yada çok kod yazmakla alakalı değildir.

permanent link

cevaplandı: 27 Eyl '14, 03:42

kodmanyagha's gravatar image

kodmanyagha
3.1k132852
cevap kabul oranı: 15%

değiştirildi: 27 Eyl '14, 03:43

Esasında az veya çok kod yazmaktansa, az ve çok sınıf, metot (yada fonksiyon) ile tasarım yapmak arasında ki fark ve eğer varsa böyle bir farkın hafıza alanında veya yönetiminde oluşturduğu olumlu/olumsuz etkisi bir merak konusuydu. Teşekkürler.

(29 Eyl '14, 06:58) cagcak cagcak's gravatar image
1

Javada hafıza o kadar önemli değildir. Zaten bu yüzden pointerlar kaldırıldı ve çöp toplayıcı kondu. Bazı ufak tefek yöntemler kullandıktan sonra hafızayı düşünmenin bir gereği yok zaten. Java için önemli olan heaptır aslında. Yani tanımlanmış değişken miktarı. Örneğin for döngüsü içinde bir değişken tanımlamak yerine tanımlı değişkeni kullanmalısınız. Bunun gibi ufak tefek şeyler yani.

(29 Eyl '14, 15:14) kodmanyagha kodmanyagha'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:

×1,079
×5
×4

Soruldu: 25 Eyl '14, 19:15

Görüntüleme: 640 kez

Son güncelleme: 29 Eyl '14, 15:14

powered by BitNami OSQA