Agora Metin2 1
Agora Metin2
Karan2offical 1
Karan2offical
mavzermete 1
mavzermete
M 1
m2referencee
Fethi Polat 1
Fethi Polat
InfernoShade 1
InfernoShade
farkmt2official 1
farkmt2official
romegames 1
romegames
bikral 1
bikral
PrimeAC 1
PrimeAC
Hikaye Ekle

Swift kullanarak SOLID Tasarım Prensibi

  • Konuyu başlatan Konuyu başlatan ibrahim6516
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 2
  • Görüntüleme Görüntüleme 355

ibrahim6516

EFSANE · 16 · Konum Bursa
Telefon Numarası Onaylanmış Üye TC Kimlik Numarası Doğrulanmış Üye
Fahri Üye
TM Üye
Katılım
8 Eki 2012
Konular
555
Mesajlar
1,301
Online süresi
2mo 3d
Reaksiyon Skoru
718
Altın Konu
68
TM Yaşı
13 Yıl 8 Ay 14 Gün
Başarım Puanı
282
MmoLira
2,295
DevLira
243
Ticaret - 100%
1   0   0

HERAKLES Otomatik Avlı kalıcı sunucu. 19 Haziran'da açılıyor. Atius & Wizard güvencesiyle hemen kayıt ol, ön kayıt ödülleri aktif. HEMEN TIKLA!

SOLID ilkeleri, etkili, sürdürülebilir, ölçeklenebilir ve gevşek bağlı bir sistemin uygulanmasının/yaratılmasının temelidir.

Yazılım yazmaya yeni başlamış olmanız veya yıllardır yapıyor olmanız önemli değil. Sisteminizi uygularken bu ilkelere uymaya başlarsanız, sistemdeki her bir katılımcı tarafından takdir edilecektir.

SOLID ne anlama geliyor?
1*yO6YGExWLJl5VOUL61xXvQ.jpeg

1*yO6YGExWLJl5VOUL61xXvQ.jpeg



💎 Tek Sorumluluk İlkesi 💎

Sınıfın değişmesi için tek bir nedeni olmalıdır. Zaman içinde ancak o sınıf bağlamında birden çok kez değiştirilebilir. Basit bir ifadeyle, sınıfta değiştirmek için bağlamsal bir nedeni olmalıdır.

💎 Açık ve Kapalı Prensibi 💎

Basit bir ifadeyle, Uzatma için açık ancak değişiklik için kapalı. Sınıflar, sınıfın işlevselliğini genişletmek için açık olmalı ancak mevcut işlevselliğe dokunmaya/değiştirmeye izin vermemelidir.

Aşağıdaki kullanım örneğinden biraz daha anlamaya çalışalım,

Uygulamamızda ödeme entegrasyonu şartı bulunmaktadır. Nakit, kart veya farklı cüzdan kullanma gibi farklı ödeme yöntemlerimiz var.

SOLID'den O ilkesini takip etmezsek, sınıf uygulamamız şöyle olabilir:

1*XrzvRJTpK0y6bXTqoV9MqQ.png

1*XrzvRJTpK0y6bXTqoV9MqQ.png

Ödeme Yöneticisi… Ödeme için her şeyi yapacağım
Tüm ödeme işlevlerini yerine getirmekten sorumlu olan ödeme yöneticisi sınıfına sahip olacağız. Farklı ödeme yöntemleri için farklı işlevler oluşturduk ve bu ödeme yöntemiyle ilgili tüm ilgili işlevler bunun içinde yer alacak.

😊 😊 😊 endişe Ayrılıklar 😊 😊 😊

Ödemeyle ilgili bir şey olup olmadığını biliyorum. Ödeme yöneticisi sınıfına dokundum.

İYİ görünüyor, Mükemmel çalışıyor!!!

Bekle…


Son zamanlarda Hindistan Ulusal Ödemeler Kurumu, bir UPI (Birleşik Ödeme Arayüzü) ödeme sistemi geliştirdi ve RBI (Hindistan Rezerv Bankası) tarafından düzenlendi .

Gelecekte, başka birçok ödeme sistemi gelebilir. Şimdi mevcut ödeme yöneticisi sınıfını değiştirmemiz/değiştirmemiz ve UPI ödeme sistemi için bir provizyon yapmamız gerekiyor ve her yeni ödeme sistemi mevcut olduğunda, ödeme yöneticisini değiştirmemiz gerekiyor.

Bunda yanlış olan ne?

Mevcut kodu değiştiriyoruz, her zaman istemeden mevcut kodu kırma şansı var.

En kullanarak tasarlamak çalışalım Ç prensibini gelen KATI.

Açık-Kapalı ilkesinin arkasındaki birincil mekanizmalar soyutlama ve polimorfizmdir.


1*s6KXBszk1fz95ZXd3l-_9w.png

1*s6KXBszk1fz95ZXd3l-_9w.png

Soyutlama ve Polimorfizm
Her ödeme yönteminin ayrı bir sınıfı olacaktır. Yeni bir ödeme yöntemi eklemek için yeni bir sınıf ekleyeceğiz ve Ödeme Yöneticisi yalnızca kendini genişletmekle sorumlu olacak ve mevcut herhangi bir ödeme yöntemi sınıfına dokunmayacak, bu da bizi istemeden bir şeyleri kırmaktan koruyacaktır.

Sanırım istemeden de Tek Sorumluluk İlkesi'ne uyuyoruz 😊 😊 😊

💎 Liskov İkame Prensibi 💎

Bu ilke, sürdürülebilir ve yeniden kullanılabilir kod oluşturmanın temelidir. Bu ilke, Açık-Kapalı ilkesinin uzantısıdır ve yeni türetilmiş sınıfların davranışlarını değiştirmeden temel sınıfı genişlettiğinden emin olmamız gerektiği anlamına gelir.

Bunu yapmak için aşağıdaki Bird temel protokolü oluşturulur 🐦


🐦
Geliştirici, Bird protokolünü onaylayan birçok farklı türde kuş sınıfı oluşturabilir.

Fakat ikinci versiyonda Penguin sınıfını ekleyip Bird protokolüne onay vermemiz gerekiyor fakat bir sorun var. “🐧 uçamaz.


🐧 İçinde herhangi bir uygulama yok 🐧
Bir geçersiz kılma yöntemi hiçbir şey yapmazsa veya yalnızca bir istisna atarsa, muhtemelen LSP'yi ihlal ediyorsunuzdur.

Uygulama çalıştırıldığında, Penguin nesneleri setAltitude yöntemini yok saydığından tüm uçan desenler yanlış görünür. Penguenler yerde yüzüyor. Geliştirici OCP'yi takip etmeye çalışsa da başarısız oldu. Mevcut kod, Penguin sınıfını barındıracak şekilde değiştirilmelidir.

Bir penguen teknik olarak "bir" kuş olsa da, Bird sınıfı tüm kuşların uçabileceğini varsayar. Penguen alt sınıfı uçma varsayımını ihlal ettiğinden, Bird üst sınıfı için Liskov İkame İlkesini karşılamaz.

Bu sorundan nasıl kurtulur?

Liskov İkame Prensibini Takip Edin
İŞARETÇİLERİ VEYA TABAN SINIFLARINA REFERANSLARI KULLANAN FONKSİYONLAR TÜREV EDİLMİŞ SINIFLARIN NESNELERİNİ BİLMEDEN KULLANABİLİR OLMALIDIR.

Tom'un Penguen Problemi

💎 Arayüz Ayrıştırma Prensibi 💎

Arayüz Ayrıştırma İlkesi istemcilerin kullanmadıkları arabirimleri uygulamaya zorlanmaması gerektiğini belirtir. Tek bir yağ arayüzü yerine, her biri bir alt modüle hizmet eden yöntem gruplarına dayalı birçok küçük arayüz tercih edilir.

Basit bir ifadeyle, İstemciler kullanmadıkları arabirimlere bağımlı olmaya zorlanmamalıdır.
2 tip çalışanımız var, bazıları ortalama ve bazıları çok verimli çalışanlarımız. Her iki tür işçi de çalışır ve yemek için günlük bir fırlatma molasına ihtiyaçları vardır.


Arayüz Ayrımı İlkesi Olmadan
Ama şimdi çalıştıkları şirkete bazı robotlar da geldi, ama yemek yemedikleri için fırlatma molasına ihtiyaçları yok. Bir yandan yeni Robot sınıfının, robotlar çalıştığı için IWorker protokolünü/arayüzünü uygulaması gerekir. Öte yandan, yemedikleri için uygulamak zorunda değiller.


Yeni işçi Robot- Yemek yemiyor.
Bu durumda IWorker'ın kirli bir arayüz/protokol olarak kabul edilmesinin nedeni budur.
Mevcut tasarımı korursak, yeni Robot sınıfı yemek yöntemini uygulamak zorunda kalır. Hiçbir şey yapmayan kukla bir sınıf yazabiliriz (diyelim ki günde 1 saniyelik bir başlatma arası) ve uygulamada istenmeyen etkilere neden olabilir.

Arayüz Ayrımı İlkesine göre, esnek bir tasarım kirli arayüzlere sahip olmayacaktır. Bizim durumumuzda IWorker arayüzü 2 farklı arayüze bölünmelidir.


Arayüzleri/protokolü Ayıralım
Bunu, Arayüz Ayrıştırma İlkesini destekleyen koddan sonra gelir. IWorker arabirimini 2 farklı arabirime bölerek, yeni Robot sınıfı artık yeme yöntemini uygulamak zorunda kalmıyor. Ayrıca, robot için yeniden şarj etme gibi başka bir işleve ihtiyacımız olursa, yeniden şarj etme yöntemiyle başka bir IRechargeble arabirimi oluştururuz.


Arayüz Ayrıştırma İlkesi
Bu, çalışma süresi sürprizlerinin olmadığı anlamına gelir. Derleme zamanında Robot'un yemek yiyemeyeceğini biliyoruz.

NOT:
Arayüzün bunu yapmanın daha net olması için protokol adının önündeki 'I'yi kullandım. Biliyorum, Swift dilinde bu adlandırma kurallarını/gösterimlerini kullanmıyoruz/takip etmiyoruz.

💎 Bağımlılık Tersine Çevirme Prensibi 💎

Bağımlılık inversiyon prensibi belirli bir biçimine atıfta yazılım .

A. Yüksek seviyeli modüller, düşük seviyeli modüllere bağlı olmamalıdır. Her ikisi de bağlı olmalıdır .

B. Soyutlamalar ayrıntılara bağlı olmamalıdır. Detaylar soyutlamalara bağlı olmalıdır.


Diyelim ki, üst düzey bir sınıf olan Yönetim sınıfına sahip olduğumuz ve Çalışan adlı düşük seviyeli bir sınıfımız olan bir şirket yönetim sistemi kuruyoruz.


Bağımlılık Tersine Çevirme İlkesi Olmadan
Yeni uzman personel alımı ile şirket yapısındaki değişiklikleri modellemek için uygulamamıza yeni bir modül eklememiz gerekiyor. Bunun için yeni bir sınıf İşveren yarattık.


Sistemde yeni bir İşveren olması şartı
Manager sınıfının oldukça karmaşık olduğunu ve çok karmaşık mantık içerdiğini varsayalım. Ve şimdi yeni İşvereni tanıtmak için onu değiştirmeliyiz.

Dezavantajları görelim:

1. Management sınıfını değiştirmeliyiz (bunun karmaşık olduğunu ve bu, değişiklikleri yapmak için zaman ve çaba gerektireceğini unutmayın).
2. Yönetim sınıfındaki bazı mevcut işlevler etkilenebilir.
3. Birim testi yeniden yapılmalıdır.
Tüm bu sorunların çözülmesi çok zaman alabilir ve eski işlevsellikte yeni hatalara neden olabilir. Uygulama, Bağımlılık Tersine Çevirme İlkesine göre tasarlanmış olsaydı durum farklı olurdu.

Bu, Yönetim sınıfını, bir IEmployee arabirimini ve IEmployee arabirimini uygulayan Çalışan sınıfını tasarladığımız anlamına gelir. İşveren sınıfını eklememiz gerektiğinde tek yapmamız gereken bunun için IEmployee arabirimini uygulamaktır. Mevcut sınıflarda ek değişiklik yok.
 
Paylaşım için teşekkürler :)
 
Paylaşım için teşekkürler.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst