İsimlerinizi, fiillerinizi, sıfatlarınızı yazmak harika bir yaklaşımdır, ancak sınıf tasarımını hangi verilerin gizlenmesi gerektiği sorusunu sormayı düşünmeyi tercih ederim ?
Bir Query
nesneniz ve bir Database
nesneniz olduğunu düşünün :
Query
Nesne oluşturmanıza yardımcı ve bir sorgu saklar - mağaza, bir işlev yardımcı olabilir gibi aynı kolaylıkla bir tane oluşturun, burada anahtarıdır. Belki kalabilirsin Query().select('Country').from_table('User').where('Country == "Brazil"')
. Sözdizimi tam olarak önemli değil - bu sizin işiniz! - anahtar, nesnenin bir şeyi gizlemenize yardımcı olmasıdır , bu durumda bir sorguyu saklamak ve çıktılamak için gerekli veriler. Nesnenin gücü onu kullanma sözdiziminden gelir (bu durumda bazı akıllı zincirleme) ve çalışmasını sağlamak için ne sakladığını bilmeye gerek yoktur. Doğru yapılırsa Query
nesne birden fazla veritabanı için sorgu çıktısı verebilir. Dahili olarak belirli bir formatı depolardı, ancak çıktı alırken kolayca diğer formatlara dönüşebilir (Postgres, MySQL, MongoDB).
Şimdi Database
nesne üzerinde düşünelim . Bu ne saklıyor ve saklıyor? Açıkçası veritabanının tüm içeriğini depolayamaz, çünkü bu yüzden bir veritabanımız var! Peki amaç ne? Amaç, nesneyi kullanan insanlardan veritabanının nasıl çalıştığını gizlemektirDatabase
. İyi sınıflar içsel durumu manipüle ederken akıl yürütmeyi basitleştirecektir. Bu Database
nesne için , ağ çağrılarının nasıl çalıştığını gizleyebilir veya toplu sorgular veya güncellemeler ya da bir önbellek katmanı sağlayabilirsiniz.
Sorun, bu Database
nesnenin BÜYÜK olmasıdır. Bir veritabanına nasıl erişileceğini temsil eder, bu yüzden kapakların altında her şeyi ve her şeyi yapabilir. Açıkça ağ, önbellekleme ve yığınlama sisteminize bağlı olarak başa çıkmak oldukça zordur, bu nedenle onları gizlemek çok yardımcı olacaktır. Ancak, birçok kişinin not edeceği gibi, bir veritabanı inanılmaz derecede karmaşıktır ve elde ettiğiniz ham DB çağrılarından ne kadar uzak olursa, performansı ayarlamak ve işlerin nasıl çalıştığını anlamak daha zordur.
Bu, OOP'nin temel ödünleşmesidir. Doğru soyutlamayı seçerseniz kodlamayı kolaylaştırır (String, Array, Dictionary), çok büyük bir soyutlama seçerseniz (Veritabanı, EmailManager, NetworkingManager), nasıl çalıştığını veya ne yapılacağını gerçekten anlamak çok karmaşık hale gelebilir bekliyoruz. Amaç karmaşıklığı gizlemektir , ancak bazı karmaşıklık gereklidir. İyi bir kural, Manager
nesnelerden kaçınmaya başlamak ve bunun yerine benzer sınıflar oluşturmaktır structs
- tek yaptıkları verileri tutmak, hayatınızı kolaylaştırmak için verileri oluşturmak / değiştirmek için bazı yardımcı yöntemlerle. Örneğin, EmailManager
başlangıçta sendEmail
bir Email
nesne ile başlayan bir nesne alır . Bu basit bir başlangıç noktasıdır ve kodun anlaşılması çok kolaydır.
Örneğinize göre, aradığınızı hesaplamak için hangi verilerin birlikte olması gerektiğini düşünün. Örneğin, bir hayvanın ne kadar yürüdüğünü bilmek isterseniz, AnimalStep
ve AnimalTrip
(AnimalSteps koleksiyonu) dersleriniz olabilir. Artık her Yolculuğun tüm Adım verilerine sahip olduğuna göre, bu konuda bir şeyler bulabilmeli, belki AnimalTrip.calculateDistance()
de mantıklı olmalı .