Yapay zekadan makale özeti
- Kısa
- Ayrıntılı
- Bu video, Ankara'da Savunma Sanayi Endüstrisi'nde çalışan ve Go programlama dilinde iki yıldır aktif olarak çalışan bir yazılım geliştiricisi tarafından sunulan eğitim içeriğidir. Sunumda İbrahim adında bir kişi de yer almaktadır.
- Video, clean code kavramının tanımı ve mimarisinin açıklanması üzerine odaklanmaktadır. İçerik, dört katmanlı bir mimari yapısı (entities, use case, interface adaptör ve framework driver) tanıtarak başlıyor, ardından Go projelerinde standart klasör yapısını ve best practice'leri anlatıyor. Son bölümde ise model, repository, servis ve API katmanlarının nasıl test edilebileceği, özellikle API testlerinin tüm proje davranışını test etme avantajı ve test edilebilir kod yazmanın temel prensipleri detaylı olarak açıklanıyor.
- Eğitimde "Going Standard Project Lava" adlı GitHub reposundan örnekler verilerek Go projelerinde bulunması gereken klasörler (cmd, internal, pkg, config, app, router, storage, model, pub, store, utis, render) ve bunların işlevleri açıklanmaktadır. Ayrıca Kubernetes, Prometheus, Metamas ve Passwl gibi popüler Go projelerinin klasör yapıları örnek olarak gösterilmekte ve Peter Burgon'un makalesinden örneklerle doğru test yazma yöntemleri anlatılmaktadır.
- 00:05Sunum ve Konuşmacının Tanıtımı
- Sunum, Go projelerinde Clean Code mimarisi uygulamasını ele alacak.
- Konuşmacı, Ankara'da bulunan ve savunma sanayi endüstrisinde çalışan bir yazılım geliştiricisidir.
- Şu anki çalıştığı şirket IC Defense'de kritik altyapılar, enerji santralleri, nükleer santraller ve petrol botları gibi endüstriyel sistemlerin siber güvenliği sağlayan yazılım geliştirmektedir.
- 01:54Clean Code Kavramı
- Clean Code kavramı, Robert C. Martin (Uncle Bob) tarafından 1 Ağustos 2008'de yayınlanan "Clean Code" kitabında tanıtılmıştır.
- Clean Code kavramı, geçmişte yaşanan kodlama tecrübelerinin bir araya getirildiği bir kitap olarak düşünülebilir.
- Clean Code mimarisinde, bir proje sadece bir klasör yapısına veya framework'e bağımlı olmamalıdır.
- 04:25Clean Code Mimarisi
- Clean Code mimarisi dört layerdan oluşur: Enterprise Business Application (EBA), Business Interface Adaptör ve Framework Driver.
- En merkezi katman olan Entities (Domain), projenin temel modüllerini içerir.
- Use Case (servis katmanı), gelen veriyi veritabanına girmeden önce işleyerek modelle iletişime girer ve controller'lara veri aktarımı sağlar.
- 07:21Clean Code Mimarisinin Faydaları
- Clean Code mimarisinin temel hedefi, framework, database ve UI bileşenlerinden bağımsız bir proje üretmektir.
- Bu mimari sayesinde business logic'e daha fazla odaklanılabilir ve kolayca test edilebilir.
- Bir parçayı değiştirmek, okunması, geliştirilmesi ve maintenance edilmesi kolaylaşır.
- 08:24Günümüzdeki Mimari ve Klasör Yapısı
- Günümüzdeki mimaride model (domain) her zaman el altında bulunması gereken bir yerdir.
- Veritabanıyla doğrudan iletişim kuran bir repozitörü bulunur ve mimari bozulmamak için use case veya controller doğrudan veritabanı ile iletişim kurmamalıdır.
- Go projelerinde genellikle ilk olarak cmd klasörü oluşur ve bu klasörde sadece projenin ismi ve main.go dosyası bulunur.
- 10:33Go Proje Klasör Yapısı ve Standartlar
- Going Standard Project Lava adlı GitHub reposu, Go projelerinde bulunması gereken klasörleri ve bunların neden bulunduğu hakkında bilgi vermektedir.
- Bu standart, uluslararası ve açık kaynak bir yapıdır ve herkesin kontrol edebileceği bir standart sunmaktadır.
- GitHub reposunda CMD klasörü gibi popüler klasörlerin örnekleri bulunmaktadır; Prometheus, Influx Data ve Kubernetes gibi projeler bu klasörü kullanmaktadır.
- 12:09Go Proje Klasör Yapısı Detayları
- CMD klasörü başlangıç klasörüdür ve içine sadece main.go gibi dosyalar bulunur.
- Internal klasörü, Go tarafından zorlanan özel bir klasördür; bu klasöre atılan veriler dışarıdan başka paketler tarafından çağrılamaz.
- Pkg klasörü ise internal'ın tam tersi, harici uygulamalar tarafından çağırılabilen kodları içerir.
- 13:24Farklı Projelerin Klasör Yapısı
- Prometheus'un klasör yapısında CMD, config, deck, uty, render gibi standart klasörler bulunmaktadır.
- Metamod server'ın klasör yapısında business logic için app klasörü, config, biot, external interfaces gibi klasörler bulunmaktadır.
- Passwl projesinde de CMD yapısı vardır ve internal klasörünün içinde app, config, router, storage gibi dışarıdan çağrılmasını istenmeyen yerler bulunmaktadır.
- 15:09Clean Code Mimarisi Uygulaması
- Clean code mimarisinin en büyük faydalarından biri rahatlıkla test yazabilmemizi sağlamaktır.
- Proje yazarken doğrudan Mango'ya HTTPS: serve şeklinde yazmak yerine, apps struct'ı oluşturarak test yazmanın kolaylığını sağlayabiliriz.
- Apps struct'ı initialize, run ve route olmak üzere üç fonksiyon içerir; initialize fonksiyonunda veritabanı bağlantısı oluşturulur ve bu bağlantı router'un içine aktarılır.
- 18:34Katmanlı Yapı ve Test Yazımı
- Post API'yi ayağa kaldırırken database bağlantısı API'nin içine gönderilir, böylece katman katman tüm katmanlarda database bağlantısı bulunur.
- Test yazarken database bağlantısını dışarıdan değiştirerek sahte bir veritabanı üzerinde test yazılabilir.
- Repository, servis ve API katmanları arasında iletişim kurulurken, farklı objeler için bir interface altında kontrat altında iletişim kurmak daha mantıklıdır.
- 20:45Go Mimarisinde Katmanlar
- Go mimarisinde model, repository, service ve API katmanları bulunur.
- Model katmanında veritabanındaki model, time objeleri ve front-end'e dönen create, update, delete gibi veritabanı modelleri yer alır.
- ORM kullanıyorsanız, model dosyalarına bakarak veritabanı tablolarınızı oluşturabilirsiniz.
- 21:23Model ve DTO
- Model dosyalarına genellikle DT (Data Transfer Object) denir ve arayüze iletişim kurduğumuz yerlerde kullanılır.
- Normal veritabanı modeli ve DTO arasında dönüştürme fonksiyonları gereklidir.
- Model katmanında normal veritabanı modeli ve DTO bulunur, bu iki veriyi birbirine dönüştüren fonksiyonlar mevcuttur.
- 22:17Repository Katmanı
- Repository katmanında modelin veritaban ile ilişkileri (create, update, delete) yer alır.
- Repository katmanında veritabanı işlemleri doğrudan yapılır, hiçbir business işlemi yoktur.
- Repository katmanında veritabanından veri çekme, kaydetme, silme ve migration işlemleri yapılır.
- 23:37Servis Katmanı
- Servis katmanı, business projenin gerçekleştiği yerdir.
- Servis katmanında repository fonksiyonlarını çağırarak ekstra işlemler yapılır (örneğin kullanıcıdan gelen veriyi büyük harfe çevirme).
- Servis katmanında fonksiyon isimleri repository ile büyük oranda aynı olabilir ancak aynı olmak zorunda değildir.
- 24:56API Katmanı
- API katmanı, front-end'e cevapları döndüğümüz katmandır.
- API katmanında HTTP handle function'lar kullanılır ve servis katmanına doğrudan erişim sağlanır.
- API katmanında gelen veri işleme yapılır, ancak veri işleme işlemleri servis katmanında yapılır.
- 27:24Test Yazımı
- Model katmanındaki dönüştürme fonksiyonları dışarıya bağımlılığı olmadığı için kolayca test edilebilir.
- Repository katmanında sadece veritabanı bağımlılığı vardır, bu nedenle test edilebilir.
- Go'da unit test, paketin davranışını test etmektir ve mümkünse dışarıya dönen API testlerini yazmak faydalıdır.
- 29:36Test Kapsamı
- Model, repository ve servis katmanlarındaki testler sadece ilgili fonksiyonları test eder.
- API'ı test ettiğinizde doğrudan bütün katları test etmiş olursunuz çünkü API tüm veri akışını tespit eder.
- API test ettiğinizde, cevap yanlış dönüyorsa repository'de veri gitme aksaklığı olduğunu tespit edebilirsiniz.
- 32:13Test Edilebilir Kod Yazma
- Bir fonksiyonun test edilebilir olması için global değişkenler yerine dışarıdan gönderilen parametreler kullanılmalıdır.
- Test edilebilir kod yazmak için interface kullanmak önemlidir, çünkü interface test etmenin temel kuralıdır.
- Interface kullanarak HTTP request gibi kesin tiplerin test edilebilir hale getirilmesi sağlanır.
- 33:53Gerçek Hayattaki Örnek
- Gerçek hayatta database testinde, db setup, router setup ve api setup gibi adımlar izlenir.
- DB setup aşamasında mock DB oluşturulur ve PostgreSQL'e bağlanır.
- Router setup aşamasında API objesi oluşturulur ve sadece belirli bir uçuş test edilir.
- 35:41API Testi Yapma
- API testi için önce standart HTTP test new recorder başlatılır, ardından db setup ve ap setup çalıştırılır.
- Testte önce bir post oluşturulur, ardından SQL tablosunda tek bir kayıt eklenir.
- Testte HTTP request atılır, gelen cevabın statüs kodu ve body'si kontrol edilir.
- 37:45Test Sonuçları ve Faydaları
- Testin başarılı olması, API'ye gönderilen veri ile veritabanından gelen verinin eşit olması anlamına gelir.
- Deep IQ paketi kullanılarak tüm öğelerin birbirine aynı olup olmadığı test edilebilir.
- Clean code mimarisinde test yazarak, business logic'te yapılan değişikliklerin etkilerini kolayca kontrol edebilirsiniz.