İ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 Querynesneniz ve bir Databasenesneniz olduğunu düşünün :
QueryNesne 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 Querynesne 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 Databasenesne ü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 Databasenesne 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 Databasenesnenin 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, Managernesnelerden 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, EmailManagerbaşlangıçta sendEmailbir Emailnesne 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, AnimalStepve 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ı .