N-tier architecture'da servis ve repository farki nedir?

Katılım
12 Mayıs 2020
Mesajlar
1.171
Çözümler
6
Arakdaslar BL katmaninda CRUD islemleri icin servisler var, DAL katmaninda ise CRUD islemleri icin repositoryler var. Peki neden burada tek bir katman uzerinden bu islem yapilmiyor? Okudugumdan anladigima gore bir taraf spesifik aramalar yapiyor. Digeri ise dis dunyadan gelen cikan verileri inceliyor diye. Cok saçma degil mi neden tek katmanda bu islemleri yapmiyoruz? Projemde soyle bir yol izledim:

Mesela kullanici islemleri var diyelim; buradaki Kullanici olusturma silme guncelleme islemleri burada yapiliyor, Repository katmaninda ise mesela ID'ye gore arama veya emaili Gmail olanlar olarak arama gibi aramalar yapiyorum. Bu yapiyi Gemini'ye attigimda yanlış dedi. Dogrusu nedir acaba?
 
Arakdaslar bl katmaninda CRUD islemleri icin servisler var, dal katmaninda ise CRUD islemleri icin repositoryler var. Peki neden burada tek bir katman uzerinden bu islem yapilmiyor? Okudugumdan anladigima gore bir taraf spesifik aramalar yapiyor. Digeri ise dis dunyadan gelen cikan verileri inceliyor diye. Cok saçma degil mi neden tek katmanda bu islemleri yapmiyoruz? Projemde soyle bir yol izledim:

Mesela kullanici islemleri var diyelim; buradaki kullanici olusturma silme guncelleme islemleri burada yapiliyor, repository katmaninda ise mesela ID'ye gore arama veya emaili Gmail olanlar olarak arama gibi aramalar yapiyorum. Bu yapiyi Gemini'ye attigimda yanlış dedi. Dogrusu nedir acaba?

Hocam müsait olduğunuz bir durumda bir ara size yazılım mühendisliği ile ilgili birkaç soru sorabilir miyim?
 
Simdi sor kral musait oldukca cevaplarim.

Teşekkür ederim hocam. Hocam benim merak ettiğim şey yazılım mühendisliği okurken sosyal imkanlarınız ne kadar oluyor yani ben kendim için üniversitenin kulüplerinde aktif olmak şehir içinde farklı kurslara katılmak farklı aktiviteler yapmak istiyorum çok dolu dolu geçirmek istiyorum. Yani mühendislik okurken sizce aktiflik ne kadar oluyor hocam ciddi bir şekilde zamanınız oluyor mu?
 
Cunku datayi nereden aldigin, nasil kaydettigin business katmaninin problemi degil.

Mesela kullanici islemleri var diyelim; buradaki Kullanici olusturma silme guncelleme islemleri burada yapiliyor, Repository katmaninda ise mesela ID'ye gore arama veya emaili Gmail olanlar olarak arama gibi aramalar yapiyorum. Bu yapiyi Gemini'ye attigimda yanlış dedi. Dogrusu nedir acaba?

Kullanicinin nasil silinecegi business layerin problemi degil. Silme ve update islemi de Data layer'da olmali. Business layer silmesi gerektigine karar vermeli ve nasil silinecegi umrunda olmamali.

Araba soforu, yaninda yakin koruma ve arkada oturan VIP insan gibi dusunebilirsin katmanlari. Bir tanesi nasil surmesi gerektigini, hizini vs dusunuyor; diger seyler umrunda degil. Digeri guvenligi dusunuyor, nereye gittikleri pek umrunda degil. En arkadasinin araba surmeyi bilmesine gerek yok, sadece ne zaman nerede olmasi gerektiklerini biliyor.

Bu sekilde katmanlara ayirarak daha esnek tasarimlar yapabiliyoruz, Sofor degistirmek diger sistemleri hic etkilemiyor bu anolojide. Sen de MSSQL yerine MySQL kullanmaya karar verirsen bir gun business layer'da 0 satir kod degistireceksin. Cunku onun problemi degil datayi nereden nasil aldigin.
 
Teşekkür ederim hocam. Hocam benim merak ettiğim şey yazılım mühendisliği okurken sosyal imkanlarınız ne kadar oluyor yani ben kendim için üniversitenin kulüplerinde aktif olmak şehir içinde farklı kurslara katılmak farklı aktiviteler yapmak istiyorum çok dolu dolu geçirmek istiyorum. Yani mühendislik okurken sizce aktiflik ne kadar oluyor hocam ciddi bir şekilde zamanınız oluyor mu?

Kral soyle aktiflik derken misal ben okula gidiyorum okuldan sonra spora gidiyorum spordan sonra ders calisiyorum ders calistiktan sonra arkadaslarimla sohbet muhabbet en sonda dizi izliyorum. Psikolojim pek iyi sayilmaz bir an once diger dunyaya gitmek istiyorum. Hayatimi pek sevmiyorum ama bolumumden dolayi degil beni bolumum ayakta tutuyor diyebilirim. Sosyal imkan olarak soyle her seye zaman bulursun ya ekran surene bak Instagram 6 saat yaziyor. O 6 saat i 3 saate dusur o 3 saatte ders calis. Geri kalan hayatina normal devam et veya o 3 saat git disarida arkadaslarinla takil. Biz de dolu dolu gecirmek kuluplerde aktif olmak istiyoruz fakat mesela kisisel sikintilardan dolayi hiçbir şey yapasim gelmiyor. Misal istedigim kulube girerim aktivite yaparim fakat ne bileyim icimden geliyor ama yapan yapar bunu unutma. Şey deme yani ben bu kulube gidersem ders calisamam iste disarida gezersem ders calisamam diye illa zaman var. Fakulte ici imkanlar biraz sikintili ama sosyallik acisindan. Muhendislik fakultesi bayagi bir asosyal olur bu senin elinde ben gayet sosyal birisiyim ama fakulte ici bir seyler bulamiyorum hiç. Ciddi sekilde zamanim da oluyor dedigim gibi misal oglen 1 de dersim bitti okul cikisi spora gittim 3'te yurda geldim market alisverisi yaptim yemek yedim saat 4 oldu 1 saat ustumu degistim falan ortalama yarim saat dedik 4.5 da AVM'ye geldim sb de ders calisiyorum o saatten beri. Muhendisligin bir faydasi da okumasi gayet maliyetsiz oluyor yok kitap yok gezi yok suraya gidelim buraya gidelim olmuyor birileri senden para istemiyor. Disari cikacagin gunu sen belirliyorsun misal hafta ici 2 gun disarida ders calisirim 3 gun yurtta ders calisirim cumartesi gunleri camasir yikarim aksam alkol iceriz pazar gunu da ya Rusça'ya İngilizce calisirim. Sana bagli yani her şey. Ama genel anlattiklariam bakarsan benlik sikintilardan dolayi bir an once diger dunyaya gitmek istiyorum eminim ki orada daha guzel bir hayatim olacak gunah diye kendime zarar veremiyorum oyle yani arkadaslarimdan da nefret ediyorum ailemden de nefret ediyorum kendimden de nefret ediyorum gunluk rutinler beni ayakta tutuyor ders calismak olsun spor yapmak olsun dil calismak olsun.
 
Kral soyle aktiflik derken misal ben okula gidiyorum okuldan sonra spora gidiyorum spordan sonra ders calisiyorum ders calistiktan sonra arkadaslarimla sohbet muhabbet en sonda dizi izliyorum. Psikolojim pek iyi sayilmaz bir an once diger dunyaya gitmek istiyorum. Hayatimi pek sevmiyorum ama bolumumden dolayi degil beni bolumum ayakta tutuyor diyebilirim. Sosyal imkan olarak soyle her seye zaman bulursun ya ekran surene bak Instagram 6 saat yaziyor. O 6 saat i 3 saate dusur o 3 saatte ders calis. Geri kalan hayatina normal devam et veya o 3 saat git disarida arkadaslarinla takil. Biz de dolu dolu gecirmek kuluplerde aktif olmak istiyoruz fakat mesela kisisel sikintilardan dolayi hiçbir şey yapasim gelmiyor. Misal istedigim kulube girerim aktivite yaparim fakat ne bileyim icimden geliyor ama yapan yapar bunu unutma. Şey deme yani ben bu kulube gidersem ders calisamam iste disarida gezersem ders calisamam diye illa zaman var. Fakulte ici imkanlar biraz sikintili ama sosyallik acisindan. Muhendislik fakultesi bayagi bir asosyal olur bu senin elinde ben gayet sosyal birisiyim ama fakulte ici bir seyler bulamiyorum hiç. Ciddi sekilde zamanim da oluyor dedigim gibi misal oglen 1 de dersim bitti okul cikisi spora gittim 3'te yurda geldim market alisverisi yaptim yemek yedim saat 4 oldu 1 saat ustumu degistim falan ortalama yarim saat dedik 4.5 da AVM'ye geldim sb de ders calisiyorum o saatten beri. Muhendisligin bir faydasi da okumasi gayet maliyetsiz oluyor yok kitap yok gezi yok suraya gidelim buraya gidelim olmuyor birileri senden para istemiyor. Disari cikacagin gunu sen belirliyorsun misal hafta ici 2 gun disarida ders calisirim 3 gun yurtta ders calisirim cumartesi gunleri camasir yikarim aksam alkol iceriz pazar gunu da ya Rusça'ya İngilizce calisirim. Sana bagli yani her şey. Ama genel anlattiklariam bakarsan benlik sikintilardan dolayi bir an once diger dunyaya gitmek istiyorum eminim ki orada daha guzel bir hayatim olacak gunah diye kendime zarar veremiyorum oyle yani arkadaslarimdan da nefret ediyorum ailemden de nefret ediyorum kendimden de nefret ediyorum gunluk rutinler beni ayakta tutuyor ders calismak olsun spor yapmak olsun dil calismak olsun.

Hocam mesajınız için çok teşekkür ederim soruma gerçekten de cevap bulabildim çok sağ olun. Sizin de sorunlarınız umarım düzelir hocam kafanıza takmayın inşallah hallolur bir şekilde tekrardan teşekkür ederim.
 
Cunku datayi nereden aldığın, nasıl kaydettigin business katmaninin problemi degil.

Kullanicinin nasıl silinecegi business layerin problemi degil. Silme ve Update islemi de Data Layer'da olmali. Business layer silmesi gerektigine karar vermeli ve nasıl silinecegi umurunda olmamali.

Araba şoföru, yaninda yakin koruma ve arkada oturan VIP insan gibi dusunebilirsin katmanlari. Bir tanesi nasıl surmesi gerektigini, hizini vs dusunuyor; diger seyler umurunda degil. Digeri guvenligi dusunuyor, nereye gittikleri pek umurunda degil. En arkadasinin araba surmeyi bilmesine gerek yok, sadece ne zaman nerede olmasi gerektiklerini biliyor.

Bu sekilde katmanlara ayirarak daha esnek tasarimlar yapabiliyoruz, şoför degistirmek diger sistemleri hiç etkilemiyor bu anolojide. Sen de MSSQL yerine MySQL kullanmaya karar verirsen bir gun business Layer'da 0 satir kod degistireceksin. Cunku onun problemi degil datayi nereden nasıl aldığın.

Buradaki bir sorun da su mesela burada hangisinin servis hangisinin repository oldugunu nasıl anlayabilirim? Misal soyle diyelim ki GetUserById adinda bir fonksiyonum var bunun servis katmaninda olmasi icin belirli bir standartta olmasi lazim mi? Mesela diyelim ki icerisine aldigi Parametrenin farkliligi bunun oldugu yeri etkiler mi? Abi vallahi cok zorlandim ya hiçbir şey anlayamiyorum karnim da AC degil ne bileyim video izledim Gemini Pro'ya sordum yazi okudum size sordum yine de kafamda bir şey oturmadi. Aslinda aklima eski kodlarim geldi GitHub repomdan biraz okuma yaptim. Abi soyle bir senaryo dogru mu repisotorymde kullanici ekleme kodum var bir de kullanicinin olup olmadigini dogrulama kodum var. Servisimde kullanici ekleme diye bir servis yazdim burada Ilk olarak repositorymdeki kodu cagirsam bu kullanicinin kayitli olup olmadigini ogrenmek icin sonrasinda eger bu kullanici kayitli degilse yine repositorymden kayit olma fonksiyonunu cagirip burada servisim uzerinden repository kodlarimi cagirip da bu implementasyonu yapmam dogru bir senaryo mu?
 
Son düzenleme:
Buradaki bir sorun da su mesela burada hangisinin servis hangisinin repository oldugunu nasıl anlayabilirim? Misal soyle diyelim ki GetUserById adinda bir fonksiyonum var bunun servis katmaninda olmasi icin belirli bir standartta olmasi lazim mi? Mesela diyelim ki icerisine aldigi Parametrenin farkliligi bunun oldugu yeri etkiler mi? Abi vallahi cok zorlandim ya hiçbir şey anlayamiyorum karnim da AC degil ne bileyim video izledim Gemini Pro'ya sordum yazi okudum size sordum yine de kafamda bir şey oturmadi. Aslinda aklima eski kodlarim geldi GitHub repomdan biraz okuma yaptim. Abi soyle bir senaryo dogru mu repisotorymde kullanici ekleme kodum var bir de kullanicinin olup olmadigini dogrulama kodum var. Servisimde kullanici ekleme diye bir servis yazdim burada Ilk olarak repositorymdeki kodu cagirsam bu kullanicinin kayitli olup olmadigini ogrenmek icin sonrasinda eger bu kullanici kayitli degilse yine repositorymden kayit olma fonksiyonunu cagirip burada servisim uzerinden repository kodlarimi cagirip da bu implementasyonu yapmam dogru bir senaryo mu?


Oncelikle service - repo ayrimi proje yapilirken kararlastirilir. Stereotipik seyler bunlar, yani kesinligi yok. Esnetebilirsin. Hatta bu yuzden Spring'deki paket isimleri de stereotype altindadir. ( link )

Genel olarak projenin gerektirdigi bir "business requirement" olur; yani projenin hizmet ettigi cozume yonelik algoritmalarin, fonksiyonlarin butunu. Iste burasi servis katmaninda yer alir. Ornegin biz bir forum gelistiriyoruz seninle, Acimasizkopat adi altinda, gramer hatasi yapan kullaniciyi siliyoruz. Iste bu kontrolu yapan fonksiyon servis katmaninda olacak. Cunku is gereksinimi bu. Ancak kullaniciyi DB'den silen fonksiyon repository katmaninda olacak. Cunku veri islemine de o arkadas bakiyor.

Repository katmani data manipule ettigin katman. Burada isle ilgili hicbir mantik bulunmamali ( cunku o servise ait ). Ona sil dersin siler. Getir dersin getirir. O nereden getirecegini bilir ama neden getirecegini bilmez. Sen neden getirdigini bilirsin, nereden getirdigini bilmezsin. Boyle bir mantiksal ayrim olusur.

GetUserById fonksiyonu, repository'de de olabilir; servis tarafinda da. Servisler birbirlerinden kullanici isteyebilirler ve UserService seklinde bir servisin varsa uygulamada kullanicidan bu arkadas sorumludur. Diger servisler direkt bundan kullanici isteyebilirler repository'den istemek yerine.

Ayrica repository katmaninda gelen bilgi, persist edilmis bilgidir, bunu genelde direkt servis katmani disina cikarmak istemeyiz. Bu bilgiye bazi islemler uygulayamak gerekir, ornegin kullanici isminin saklanmasi ya da bazi alanlarin degistirilmesi vs gibi. Bu islemler de yine servis katmaninda yer alir.

Umarim aciklayabilmisimdir; aslinda dusunursek N-tier cafcafli gibi gorunse de sadece kodu mantiksal olarak parcalara ayirmaktan baska bir sey degil. Data bir yerde, servis bir yerde, reprezentasyon bir yerde. Elbette dogru gelistirilmis bir N-tier uygulamada katmanlar hiyerarsileri disinda kod cagiramazlar. Ornegin repository servis katmanindan bir sey isteyemez. Servis repo'ya emir verir, diger servislere emir verir ama controller cagiramaz. Eger hiyerarsi ve katman arasi cagirim yaparsan tier mimarinin de icinden gecmis oluyorsun.

Burada nihai amac kodu bolumlere ayirip, kompleksiteyle mucadele etmek.
 

Technopat Haberler

Geri
Yukarı