Arayüzler
Hiç yaşamadığınız bir sorunu çözen bir aracın amacını anlamak zor. Programlamaya başladıktan sonra bir süre arayüzleri anlamadım. Ne yaptýklarýný anlayacađým, ama neden kullanmak istediđini bilmiyordum.
İşte sorun - ne yapmak istediğinizi biliyorsunuz, ancak bunu yapmak için birden fazla yolunuz var veya daha sonra nasıl yapacağınızı değiştirebilirsiniz. Clueless yöneticinin rolünü oynayabilirseniz iyi olur - bazı siparişleri havlayın ve nasıl yapıldığına dikkat etmeden istediğiniz sonuçları alın.
Küçük bir web siteniz olduğunu ve tüm kullanıcı bilgilerinizi bir csv dosyasına kaydettiğinizi varsayalım. En sofistike çözüm değil, ancak annenizin kullanıcı ayrıntılarını saklamak için yeterince iyi çalışıyor. Daha sonra siteniz yayınlanıyor ve 10.000 kullanıcınız var. Belki de uygun bir veritabanı kullanma zamanı gelmiştir.
İlk başta zeki olsaydınız, bunun geldiğini görürdünüz ve doğrudan csv'ye kaydetmek için çağrı yapmazdınız. Bunun yerine, nasıl uygulandığına bakılmaksızın ne yapmanız gerektiğini düşünürdünüz. Diyelim store()
ve retrieve()
. Bir yapmak Persister
için soyut yöntemlerle arayüzü store()
ve retrieve()
ve bir oluşturmak CsvPersister
aslında bu yöntemleri uygulayan alt sınıf.
Daha sonra, DbPersister
verilerin gerçek depolanmasını ve alınmasını csv sınıfınızın yaptığı işlemden tamamen farklı bir uygulama oluşturabilirsiniz .
Harika olan şey şu an tek yapmanız gereken değişim
Persister* prst = new CsvPersister();
için
Persister* prst = new DbPersister();
ve sonra işiniz bitti. Sizin çağrılarınız prst.store()
ve prst.retrieve()
hepsi hala çalışacaktır, onlar sadece "perde arkasında" farklı ele alınır.
Şimdi, hala cvs ve db uygulamalarını oluşturmak zorundaydınız, bu yüzden henüz patron olmanın lüksünü deneyimlemediniz. Başka birinin oluşturduğu arayüzleri kullandığınızda gerçek faydalar açıktır. Başkası oluşturmak nezaketini olsaydı CsvPersister()
ve DbPersister()
zaten, o zaman sadece gerekli yöntemler birini seçmek ve aramak zorunda. Diğerini daha sonra veya başka bir projede kullanmaya karar verirseniz, nasıl çalıştığını zaten biliyorsunuzdur.
C ++'mda gerçekten paslıyım, bu yüzden sadece bazı genel programlama örneklerini kullanacağım. Konteynerler, arayüzlerin hayatınızı nasıl kolaylaştırdığını gösteren harika bir örnektir.
Sen olabilir Array
, LinkedList
, BinaryTree
vb tüm alt sınıfların Container
gibi yöntemleri vardır ki insert()
, find()
, delete()
.
Bağlantılı listenin ortasına bir şey eklerken, bağlantılı listenin ne olduğunu bile bilmenize gerek yok. Sadece arayın myLinkedList->insert(4)
ve sihirli bir şekilde listeyi tekrarlar ve oraya yapışır. Bağlantılı bir listenin nasıl çalıştığını bilseniz bile (gerçekten yapmanız gerekir), belirli işlevlerine bakmanız gerekmez, çünkü muhtemelen daha Container
önce farklı bir kullanımdan ne olduklarını biliyorsunuzdur .
Soyut Sınıflar
(İyi teknik arayüzleri Özet sınıflar arayüzleri oldukça benzer olan bazı yöntemleri fleshed var Acımasız taban sınıfları soyut sınıf, ama burada.
Bir oyun oluşturduğunuzu ve düşmanların oyuncunun çarpıcı mesafesine ne zaman geldiğini tespit etmeniz gerektiğini varsayalım. Enemy
Bir yöntemi olan bir temel sınıf oluşturabilirsiniz inRange()
. Düşmanlar hakkında farklı olan birçok şey olmasına rağmen, menzillerini kontrol etmek için kullanılan yöntem tutarlıdır. Bu nedenle Enemy
sınıfınızda menzili kontrol etmek için etli bir yöntem olacak, ancak düşman türleri arasında benzerlik paylaşmayan diğer şeyler için saf sanal yöntemler olacak.
Bu konuda güzel bir şey, menzil algılama kodunu karıştırırsanız veya değiştirmek isterseniz, sadece bir yerde değiştirmeniz gerekir.
Tabii ki arayüzler ve soyut temel sınıflar için başka birçok neden var, ancak bunlar bunları kullanmanızın bazı nedenleri.
singletons
Onları zaman zaman kullanıyorum ve onlar tarafından hiç yakılmadım. Bu, diğer insanların deneyimlerine dayanarak hayatımı bir noktada mahvetmeyecekleri anlamına gelmez.
İşte bazı daha deneyimli ve ihtiyatlı kişilerden küresel devlet hakkında iyi bir tartışma:
Küresel Devlet neden bu kadar Kötülük?