Java Günlüğüm
Yazılım, Java, BT, azıcık felsefe, biraz mizah...
  • Udemy Eğitimleri
  • Temiz Kod
  • Tasarım Kalıpları
  • Hakkımda
  • Arşiv
RSS
03 Temmuz 2014

Java Kodunuzun Nesne-Merkezli Olmadığının 10 İşareti – VI: Aralarında benzerlik ilişkisi olan nesneleri modellemek için kalıtım kullanmamak

Akin Java, Yazılım Mühendisliği

Geliştirdiğimiz Java kodunun nesne-merkezli olmadığının 10 işaretinin neler olduğunu bu yazıda listelemiş ve ilk dört maddeyi ele almıştık. Şimdi de beşinci maddeyi ele alalım:

Aralarında benzerlik ilişkisi olan nesneleri modellemek için kalıtım kullanmamak. (No inheritance hierarchy to model is-a relationships between the objects.)

Sebebi basit: Eğer kalıtım hiyerarşileriniz yoksa aynı tipten olan nesneleri ifade ederken pek de nesne-merkezli bir yöntem kullanmıyorsunuz demektir. Kalıtım kullanmazsanız polymorphismden faydalanamazsınız. Dolayısıyla kalıtım ve bunun sonucu olan polymorphism kullanılmıyorsa “neden nesne-merkezli bir dil kullanıyorsunuz?” sorusuna muhatap olursunuz? Hakikatten kalıtım ve polymorphism yok ise nesne-merkezli dilin en temel özelliklerinden sadece sarmalama ya da encapsulationu kullanıp sınıflar oluşturuyorsunuz demektir. Bu da Java’yı tam gücüyle kullanmamak, Java’yı C gibi kullanmak demektir.

Peki, kalıtım kullanılmadığında aralarında benzerlik ilişkisi olan yapıları nasıl ifade ederiz? Aşağıdaki basit sınıf bu durumu gösteriyor:

public class User{

	private String username; 
	private String password;
        private String name;
	private String lastname;
	private int type;

	public void register(){
		if(type == 1){
			doThis();
		}
		else if(type == 2){
		        doThat();
		}
		…
	}
}

Yukarıdaki örnekte User sınıfının farklı alt tipleri kalıtım yoluyla yeni sınıflar oluşturarak değil de aynı sınıf üzerinde oluşturulmuş int tipinde type isimli bir değişkenle temsil ediliyor. Bunun en temel problemi, farklı tiplerin davranışlarını farklılaştırmak için metotlarda bol miktarda “if/switch” cümleleri kullanmak zorunda kalmaktır. Eğer kalıtım kullanılsaydı “if/switch” cümlelerini kullanmaya gerek kalmayacaktı çünkü register() metodunun farklı, override eden implementationları olacaktı.

Inheritance

Yukarıdaki durumda User sınıfının ve register() metodunun abstract olduğunu, dolayısıyla da onu extend eden sınıfların register() metodunu override ettiğini düşünebiliriz.

public abstract class User{

	protected String username; 
	…

	public abstract void register();
}

--------------------------------------------------------------
public class IndividualUser extends User{

	…

	public void register(){
		doThis();
	}
}

--------------------------------------------------------------
public class CorporateUser extends User{

	…

	public void register(){
		doThat();
	}
}

Yukarıdaki koddan da görüldüğü gibi bir kalıtım hiyerarşisi ve override edilmiş metotlar ile hem nesne açısından daha hoş bir yapıya ulaştık hem de “if/switch” cümlelerinden kurtulduk. Bu sayede tipe göre davranışı ayırt etmek artık JVM’in görevi haline geldi.

Öte taraftan kalıtım kullanmanın sarmalamaya (encapsulation) ters bir yapı olduğunu ve hiyerarşideki nesneler arasında ciddi bir bağımlılık (coupling) oluşturduğunu da söylemeliyiz. Örneğin User sınıfında yapılacak bir değişiklik alt sınıfları etkileyecek ve onların değişmesini gerektirebilecektir. Bu durum “inheritance violates encapsulation” yani “kalıtım sarmalamayı bozar” olarak ifade edilir. Bu sıkıntıdan dolayı kalıtım kullanırken dikkatli olmakta fayda vardır. Bu konu aslında burada hızlıca geçiştirilecek kadar basit değildir. Bir başka yazıda bunu ele alabiliriz.

Bol kalıtımlı günler dilerim.

 

 

Toplam görüntülenme sayısı: 1192

9 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
30 Haziran 2014

Java Kodunuzun Nesne-Merkezli Olmadığının 10 İşareti – V: Kodunuzda hiç ya da çok az sayıda arayüz olması

Akin Java, Yazılım Mühendisliği

Geliştirdiğimiz Java kodunun nesne-merkezli olmadığının 10 işaretinin neler olduğunu bu yazıda listelemiş ve ilk üç maddeyi ele almıştık. Şimdi de dördüncü maddeyi ele alalım:

Kodunuzda hiç ya da çok az sayıda arayüz olması. (No or very few interfaces in the code.)

Bu maddede ne demek istediğimi hiç lafı dolandırmadan söyleyeyim: Ben Java ile geliştirilmiş bir projeye bakıp da o projede arayüz (interface) göremezsem, ya da olsa bile projenin örneğin DAO nesneleri gibi iş mantığını içermeyen kısımlarındaysa, o projede herhangi bir tasarım faaliyetinin yapılmadığına karar veririm. Çünkü arayüz kullanmadan karmaşılığı ve değişimi yönetebilmek mümkün değildir.

Kamaşık yapıları anlaşılır hale getirmenin en temel yöntemi, bölüp parçalamak ya da daha teknik ifadeyle soyutlamaktır (abstraction). Bölüp parçalayarak yeni soyutlamalar yapmak, zihnimizin en temel anlama ve problem çözme mekanizmasıdır. Yazılım geliştiriken bölüp parçalamanın sebebi ise temelde sorumlulukları ayırmaktır ki bunu da kadim “separation of concerns” yani “ilgi alanlarının ayrılması” prensibi ile açıklıyoruz.

Nesne merkezli teoride öncelikle üzerine eğilinecek, soyutlanacak, ayrılacak ilgi alanı, sorumluluklardır. Nesne-merkezli diller de önceliği daima sorumluluklara verir. Nasıl veri merkezli yaklaşım, verilerin sağlıklı bir şekilde modellenmesi, saklanması, sorgulanması gibi konuları önceliyor ve veriyi bu amaçlarla soyutluyorsa nesne-merkezli yaklaşım da önceligi sorumluluklara verip, her şeyi oradan başlatıyor. Burada ilgi alanlarını yani nesnelerin sorumluluklarını birbirinden ayırmak ve ilgili olanları bir araya toplamaktan bahsediyorsak, tabi olarak arayüzlerden yani interfacelerden bahsediyoruz demektir. Unutmayın, kodunuzda arayüz kullanmıyorsanız, muhtemelen veri merkezli ya da data-driven bir düşünce tarzına sahipsiniz demektir. Sonuçta yaptığınız da sorumluluklardan değil de veriden yola çıkarak yazılımınızı tasarlamanız ve geliştirmeniz demektir.

Öte taraftan değişimin en sıkıntılı tarafı, değişimin etkisinin yayılmasını önleyememektir. Değişimi maliyetli yapan çoğu defa kendisi değil, etkisini düzeltmenin maliyetinin yüksek oluşudur. Değişim ise çoğu kez, aynı sorumluluğu değişik şekillerde yerine getirme ihtiyacından doğar öyle ki sorumluluğun farklı şekillerde nerede ve nasıl yerine getirildiğini diğer nesneler bilmemelidirler ki değişimi kontrol altında tutabilelim (minimum info principle). Bir başka deyişle nesneler arasındaki bağımlılığı (coupling) arayüz seviyesinde tutmalıyız. Bu da tipik bir arayüz kullanımıdır.

Önce karmaşıklığı, arayüz kullanımıyla nasıl daha rahat yönetiriz onu görelim. Düşünün ki bir ERP yazılımı geliştiriyoruz ve ürettip sattığımız yiyecek olan ve olmayan ürünlerimiz var. Bu ürünleri fiyatları var ve benzer şekilde bu ürünler satılıp da müşterimize gönderilinceye kadar depolarımızda tutuluyorlar. Bu yapıyı şöyle modelleyebiliriz:

Use of Interface_ Complexity1

Görüldüğü gibi Cost ve Location, ürünün müşteriye olan maliyetini ve hangi adreste depolandığını gösteren sınıflardır. Food ve NonFood ise Product tipinden olup, satıldıkları için maliyetleri, depolandıkları için de depo adresleri olan alt sınıflardır. Peki bu ERP yapımızı bu şekilde kurguladık ve sattık. Daha sonra müşterilerimizin bazılarının danışmanlık ürünleri de olmaya başladı. Ne yapabiliriz? Muhtemelen Consultancy isimli bu yeni Product tipimizi ya NonFood‘un ya da doğrudan Product‘ın alt sınıfı yaparız. İlk hali denersek sınıf diyagramımız şöyle olur:

Use of Interface_ Complexity2

Consultancy tipi her halukarda bir Product‘tır dolayısıyla hem maliyeti hem de deposu vardır. Bu ise problemli bir durumdur. Çünkü en başta maliyeti olup da depolanmayan bir ürün düşünülmediğinden yani maliyet de depolanma da doğrudan Product olmaya bağlandığından Consultancy‘nin ifadesinde problem vardır. Çünkü Consultancy satılabilirdir ama depolanabilir değildir.

Bir başka durumu daha düşünelim: Bazı müşterilerimiz, eski kullandıkları bilgisayarları örneğin kurayla çalışanlarına dağıtıyor. Bu dağıtmayı da senede bir defa yapıyor. Ama müşteri bu sırada açığa çıkanları depoluyor ve sistemde bunların envanterini de tutmak istiyor. Yani elimizde satılmayan ama depolanan ürünler var ve bunun için Gift isimli yeni bir tipe ihtiyacımız var. Her iki sınıfın da problemi aslında sahip olmadıkları davranışı gösteriyor olmaları.

Genişçe düşünülmeden geliştirilen sistemlerde miras kullanımı genelde böyle problemlere yol açar. Yapılacak şey bu iki sınıfın yerine getirmediği davranışlar için sıradışı durum fırlatmasıdır. Hoş bir durum değil ama yapacak bir şey yok, çünkü değiştirmek çok pahalı. Peki nedir bu iki sınıfın durumunu sıkıntılı yapan şey? Aslında sıkıntı, tam bir tip problemidir. Yani Consultancy ve Gift, ürün olarak ifade edilmiş ama ilki satıldığı halde depolanmıyor, ikincisi depolandığı halde satılmıyor. Belli ki biz en başta Product‘ı tarif ederken hata yaptık. Product’ı, hem satılabilen hem de depolanabilen olarak tanımladık. Halbuki, depolanmadığı halde satılabilen, satılmadığı halde depolanabilen ürünlerin olabileceğini, dolayısıyla, ürün olmaklık ile satılabilmek ve depolanabilmenin ayrılması gerektiğini zamanında düşünmek gerekirdi. Bir şeyi o şey yapan ile o şeye eklemlenen farklı özellikleri ayırtedebilmek ancak arayüzler sayesinde olabilir. Bu anlamda bir tipin sınıfında onun asli özellikleri tanımlanmalı, arayüzünde ise devraldığı yetkinlikleri tanımlanmalıdır. Çünkü, yetkinlikler, bir şeyin en temel, ona has ve ayırt edici olan özelliklerinden değilse, muhtemelen sınıfta tanımlanmamalıdır, paylaşiıabilecek şekilde bir arayüzde tanımlanmalıdır. Bu anlamda sınıfın içine koyduklarınıza dikkat edin. Çünkü hiç bir interface yaratmadan sadece sınıftan devralarak ilerlerseniz, böyle durumlarla karşilaşmanız işten bile değildir. Aynı yapıyı arayüz tabanlı olarak şöyle tasarlamış olsaydık:

Use of Interface_ Complexity4

Yukarıdaki tasarımda satılabilir olmak ile depolanabilir olmak sırasıyla Sellable ve Storable arayüzleriyle ifade edilmiştir. Bu durumda Consultancy hem bir Product hem de Sellable tipi olurken, Gift de benzer şekilde hem bir Product hem de Storable‘dır.

Arayüz kullanmak her şeyden önce bir tasarım faaliyetidir; tasarım arayüzlerle başlar. Arayüzler, nihayetinde nesneleri oluşturulamadığından, tabiri caizse kodun değil de tasarımın parçasıdırlar. Arayüzleri kullandıkça daha kaliteli yazılımlar geliştireceksiniz.

Bol arayüzlü günler dilerim.

Toplam görüntülenme sayısı: 1352

10 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
28 Haziran 2014

“Java Kodunuzun Nesne-Merkezli Olmadığının 10 İşareti” Semineri

Akin Java, Yazılım Mühendisliği

Dün yani 27 Haziran Cuma günü, İTÜ Ari-3 Teknokent binasındaki “Java Kodunuzun  Nesne-Merkezli Olmadığının 10 İşareti” başlıklı seminerin sunumu PDF formatında buradadır. IMG_2842 Katılan herkese teşekkür ederim.

Toplam görüntülenme sayısı: 1373

12 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
20 Haziran 2014

Programcı, Developer, Architect (Mimar), Bilgisayar Mühendisi ve Yazılım Mühendisi – I

Akin Java, Yazılım Mühendisliği Architect, Developer, Mimar, programlama, Yazilim muhendisi

Kavram kargaşası, hem kafa karışıklığının bir göstergesi hem de sağlıklı iletişimin önündeki en büyük engellerden. Her toplumda olduğu gibi bizim toplumumuzda da kavram kargaşası mevcut. En çok dikkatimi çekenlerden birisiyse sektörümüzdeki roller ve bunlara verdiğimiz isimlerle ilgili. Daha önce burada “analist”, “iş analisti”, “ihtiyaç analisti” ayrımlarına yönelik yazılar (burada ve burada örneğin) yayınlamıştım. Bence benzer şey “programcı”, “developer”, “architect” ya da “mimar”, “bilgisayar mühendisi” ve “yazılım mühendisi” rolleri için de geçerli. Bu yazıda bu dört farklı rolün içeriği, benzerlikleri ve ayırımları hakkında yazmak istiyorum.

Benim gördüğüm, genelde “programcı”, “developer” ve “yazılım muhendisi” kavramlarını içerikleri arasındaki farklılıkları göz önüne almadan birbiri yerine geçecek şekilde kullandığımızdır. Çok sıklıkla okuldan yeni mezun ya da sadece PHP ve ilgili teknolojilerle, esnaf düzeyinde web geliştirmesi yapan gençlerin emaillerindeki imzalarında “Yazılım Mühendisi” ya da “Architect” gibi ünvanlar görüyorum.

Bu ülkede ünvan, yapılan işten daima daha önemli. Yaptığımızı iyi yapmaya odaklanmak yerine etiketler ve ünvanlarla uğraşmak çok hoşumuza gidiyor nedense. Halbuki yaptıkları işler, sorumlulukları, sahip olmaları gereken yetkinlikler ve eğitimleri açısından bu ünvanların aralarında ciddi farklılıklar var.

Programcı ya da orijinal ismiyle programmer, bir programlama dilinde gerekli programlama faaliyetlerini yapacak yetkinliklere sahip olan kişiye denir. En az bir dili iyi bilir, algoritmik düşünce kabiliyetlerine sahiptir, kendisine verilen programlama görevlerini en basit ve anlaşılır şekilde yerine getirir. İyi programcı, iyi kod yazar, kullandığı dili detayıyla, iyi bilir, gerekli kod dokümantasyonunu ve birim, smoke testlerini de yapar. Dolayısıyla programcı dar bir kapsamda çalışır, odaklıdır.

Malesef programcılık, ülkemizde harc-ı alem olarak görünen bir meslek. Programcılık, biraz kıvrak zekaya sahip kişilerin PHP, JavaScript vb. değişik web programlama dilleri kullanarak becerebildiği bir alan olarak görülüyor. Zaten bilgisayar, teknolojileri ve ilgili terimler ehlinin dilinden çıktığında, sade vatandaşın zihninde çok ciddi bir karmaşıklık, akıl ermezlik vs. gibi duygular uyandırıyor. “Şimdi Zeki Müren de bizi görüyor mu?” gibi bir durum yani 🙂 Dolayısıyla programcılık, akıllı bir lise mezununun rahatlıkla yapacağı bir uğraş alanı olarak görülüyor ülkemizde. (Acaba bundan dolayı mı Bilgisayar Mühendisliğini pek çok zeki lise mezunu kendine tabi bir gelecek olarak görüyor. Burada bu konuya deyinmiştim bir nebze.)

Halbuki programcılık yüksek “computer science” yetkinlikleri gerektiriyor. İşletim sistemlerinden networkinge, algoritmalardan karmaşıklığa, veri tabanlarından yapay zekaya kadar pek çok matematiksel ve bilgisayar altyapısı bilgisine ihtiyaç duyuyor. Ötesinde programcılık çok ciddi sabır, detaylı çalışma ve aşırı odaklanma gerektiren ve asosyal bir iş. Programcılık asap bozucu bir iş açıkçası 🙂

Durum böyleyken ben bu ülkede aldığı İşletim Sistemi dersine girmeyip, “bizim okulda Linux öğretilmiyor” diye şikayette bulunan Bilgisayar Mühendisliği ögrencileri görüyorum. Halbuki İşletim Sistemi dersinde Linux kerneli örneğinde bir işletim sisteminin ilgili tonla detayı ve mekanizması anlatılıyor. Bu konuda nefis ders kitapları var. Ama tüm bu dehşetengiz yapılardan habersiz olan gencimiz, Linux komutlarını açıklayan 10 sayfalık bir yazıdan medet umuyor. Bir kullanıcı olarak Linux’u öğrenmek ne kadar zor olabilir ki? Linux’u yönetim seviyesinde öğrenmek isteyen kursuna gider, bunun yeri de üniversitedeki dersler değildir, bir bilgisayar mühendisinden de beklenmez. Ama üniversitede, işletim sistemlerinin sistemdeki nesneleri nasıl kilitlediği, burada ne gibi soyutlamaların ve mekanizlamaların kullanıldığını öğretmeleri ve öğrencilerin de öğrenmeleri gerekir. (Bu gerçege pek çok kişinin itiraz edip, üniversitelerin, derslerin ve özellikle de hocaların tutumlarını sebep göstereceklerini çok iyi biliyorum, çünkü ben de o sıralardan geçtim.) Bunları iyi bir şekilde özümsemiş bir yeni mezun Linux’u istediği detayda hızlıca öğrenebilir. Neyse, konuyu dağıtmadan ilerleyelim.

Developer ise sahip olduğu sorumluluk ve yaptığı iş açısından programcıdan daha fazlasıdır. Evet programlamada programcı developerdan iyi olabilir ama developer kapsam olarak bir programcıdan daha geniş bir alanda iş yapar. Bu anlamda örneğin web tarafını düşünerek “JavaScript” programcısı ve “Web Developer” dediğimizde, bu iki rol arasında ciddi farklar vardır. İlki belli ki JavaScrip’i çok iyi bilir, her türlü detayıyla işinde kullanır. Ama web developer, JavaScript dahil web yapılarını, CSS, HTML vb. teknolojileri, bir işi baştan sona bitirecek şekilde kurgulayabilecek yetkinlikle bir kişidir. Bu anlamda aslında her developer bir programcıdır ama tersi doğru değildir.

Yukarıda belirttiğim gibi, programcı daha derin ve daha odaklıdır. Developer ise zamanının ciddi bir kısmında programlama yapar ama muhtemelen birden fazla programcıyla çalışır ve onların işlerinin daha büyük bir ölçekte birbirleriyle uyumlu olmalarını sağlar, muhtemelen bu amaçla bir miktar tasarım çalışmasında bulunur ve farklı programcıların ürettiklerinin, bir şeyi geliştirecek şekilde uyumlu olduğundan emin olur. Yani pek çok program parçasının bir araya gelerek bir yazılım sistemi haline gelmesi için developera ihtiyaç vardır. Developer bu şekilde programlamanın önü ve arkası hakkında da bilgi sahibidir. Bu anlamda yazılım geliştirme projelerinde programcı sayısı developerdan daha fazla olur.

Her programcı, zamanla developer olmak zorunda değildir. Programcılığı çok seviyordur, odaklı çalışmaya daha yatkındır, daha dar çerçevede çalışmayı tercih ediyordur ve bu yüzden pek çok farklı teknoloji ve problemle uğraşmaktan kaçınıyordur. Bu gibi sebeplerden dolayı developer olmak yerine programcı kalmayı tercih ediyordur.

Yukarıda bahsettiklerimize göre bu ülkede programcı azdır, developer çok daha fazladır diyebiliriz. Çünkü öncelikle bu ülkede odaklı çalışmak çok az görülen şeylerden. Son derece savruk çalışan bir milletiz biz. İkincisi bilgi ve tecrübenin ne olduğu konusunda aklımız karışık. Son derece odaklı çalışarak  5-10 senede öğrenilebilecek şeyleri üniversiteden mezun olurken bildiğimizi sanıyoruz. 50 yaşına gelmiş, yaklaşık 30 senedir 2-3 farklı dilde ve farklı iş konularında programcılık yapmış, işini son derece iyi bilen ve etkin yapan bir kişiye bu ülkede değer verildiğini görmek çok zor. Tam kitap yazıp, bilgi ve tecrübesini paylaşacak çağa gelmiş kişilerin aslında biraz kendi biraz da toplumsal tutumlarımız yüzünden, geride kalmış, atıl, yeni gelişmeleri çoktan kaçırmış, dinazorlaşmış olarak görülmeleri çok yaygın bir durum. Bunun en temel sebebi sağlıklı bir programlama kültürüne sahip olmayışımızdır. Halbuki ben doktora sahibi, 20 küsür senelik programlama geçmişi olan, kitap yazmış, gerçek “senior” programcılarla çalıştım ABD’de. Gerek yaptıkları iş, gerek kurumdaki yerleri son derece saygındı. Çünkü programlama zor iş, derinleşme gerektiren bir saha.

Örneğin eski mainfarme sistemlerde COBOL, RPG vb. dillerde çalışan insanlar, ya da büyük projelerde sadece C, Java vb. dillerle programlama yapanlar hep tipik programcı örnekleridir. Hatta mesela Java’nın bir bileşeninde uzmanlaşmış kişidir programcı. EJB programcısı ya da JPA programcısı gibi. Ama yukarıda dediğim gibi bu ülkedeki iş yapış şekilleri, bir kişinin odaklanması ve iş bölümü üzerine kurgulanmış değildir. Aksine herkes olabildiğince farklı ve çok şey yapsın düşüncesi BT dünyamızda çok yaygındır. Projeler ufaldıkça bu düşünce çok daha haklı bir seviyede kendini temsil eder. Bu yüzden programcı desek bile aslında çoğunlukla developerı kastederiz. Hatta network kurmadan veri tabanı yönetmeye kadar “her işi yapan” bir mühendistir istediğimiz. Bundan dolayı uzmanlaşma az görülür, insanlar teknolojiden teknolojiye atlar. Bu da bu ülkede ciddi miktarda ve derin bilgi birikimini malesef önler.

Projelerde hem programcılara hem de developerlara ihtiyaç vardır. Konuya bir sonraki yazıda devam edelim.

 

Toplam görüntülenme sayısı: 5662

27 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
«< 39 40 41 42 43 >»

Günlüğüme Hoşgeldiniz

Bu günlükte, Yazılım Mühendisliği, Bilgi Teknolojileri, Java, kişisel gelişim ve zaman zaman da diğer konulardaki düşüncelerimi sizlerle paylaşacağım. Umarım beğenir ve hoşça vakit geçirirsiniz.

Her türlü düşüncenizi, yorum olsun, beğeni ya da eleştiri olsun, bana iletmenizi rica ediyorum sizden. Ayrıca bana akin@javaturk.org adresinden ya da Twitter'dan ulaşabilirsiniz. Videolarıma da buradan ulaşabilirsiniz.

Teşekkür ederim.

Akın Kaldıroğlu

Rahat Okumak İçin

A Decrease font size. A Reset font size. A Increase font size.

Sosyal Medya

  • Twitter
  • Facebook
  • LinkedIn
  • Youtube

Son Twitlerim

→ Takip Etmek İçin

Abone Olun

Emalinizi girerek yazılardan haberdar olun.
Loading

Son Yazılarım

  • Udemy Eğitimlerim Üzerine
  • (başlıksız)
  • Clean Code / Temiz Kod Eğitimi Udemy’de
  • Java ile Nesne-Merkezli Programlamaya Giriş Eğitimi Udemy’de
  • Selsoft Video Eğitimleri
  • Spring ile Kurumsal Yazılım Geliştirme
  • Corona Günlerinde Design Patterns
  • Corona Günlerinde Java
  • JDK 10 ve “var” Özelliği
  • Onur Özcan
  • Analist ve İş Bilgisi
  • Farklı Dillerin Bakış Açısıyla Nesne-Merkezli Programlama
  • Java Nedir?
  • Bilgi Teknolojilerinde Yetenek Yönetimi – II: Tanımlar ve Eleştiriler – I
  • Alelade Hikayeler – II: Bir Başka Performans Problemi

Yazı Kategorileri

Yazı Takvimi

Mart 2026
P S Ç P C C P
 1
2345678
9101112131415
16171819202122
23242526272829
3031  
« May    

Yazı Arşivi

Blogroll

  • Binnur Kurt'un Günlüğü
  • Ender'in Java Blogu
  • Erdem Seherler
  • Kızımın Günlüğü
  • Kurumsal Java
  • Levent Karagöl
  • Levent'in Java Blogu
  • Mert Can Akkan’s java tips,options, news…
  • Yaşar Safkan
  • Yasin Saygılı
  • Yazı Dünyası

Yazı Etiketleri

analiz Bilmek C Desen design pattern EJB Eğitim Fortran Hibernate Java Java'ya nasil baslarim Java dersleri Java EE Java Persistence API Java SE Java Sertifika Java Öğren Java öğreniyorum Java öğrenmek JPA Kalıp Kurumsal Java nesne nesne-merkezli No Silver Bullet object object-oriented Oracle Java Certifications pattern performans programlama programlama dilleri programlama nedir sertifika singleton tasarım tasarım deseni tasarım desenleri tasarım şablonu yazılım yazılım geliştirme Yazılım Mühendisliği yazılımın doğası yazılımın zorlukları Şablon

↑

© Java Günlüğüm 2026
Powered by WordPress • Themify WordPress Themes
 

Yorumlar Yükleniyor...