Untuk membuat kode Anda secara longgar digabungkan di sini adalah beberapa hal sederhana untuk diingat:
Bagian 1:
Secara teknis dikenal sebagai "Pemisahan Kepedulian". Setiap kelas memiliki peran tertentu, harus menangani logika bisnis atau logika aplikasi. Coba dan hindari kelas yang menggabungkan kedua tanggung jawab. yaitu kelas yang mengelola data (istilah luas) adalah logika aplikasi sedangkan kelas yang menggunakan data adalah logika bisnis.
Secara pribadi saya menyebut ini (di dunia kecil saya sendiri) sebagai create it or use it
. Kelas harus membuat objek atau menggunakan objek yang seharusnya tidak pernah melakukan keduanya.
Bagian 2:
Bagaimana menerapkan pemisahan perhatian.
Sebagai titik awal ada dua teknik sederhana:
Catatan: Pola desain tidak mutlak.
Mereka seharusnya disesuaikan dengan situasi tetapi memiliki tema mendasar yang mirip dengan semua aplikasi. Jadi jangan lihat contoh di bawah ini dan katakan bahwa saya harus mengikuti ini dengan kaku; ini hanya contoh (dan sedikit dibuat-buat pada saat itu).
Injeksi Ketergantungan :
Di sinilah Anda melewatkan objek yang digunakan kelas. Objek yang Anda lewati didasarkan pada antarmuka sehingga kelas Anda tahu apa yang harus dilakukan dengannya tetapi tidak perlu tahu implementasi yang sebenarnya.
class Tokenizer
{
public:
Tokenizer(std::istream& s)
: stream(s)
{}
std::string nextToken() { std::string token; stream >> token;return token;}
private:
std::istream& stream;
};
Di sini kami menyuntikkan aliran ke Tokenizer. Tokenizer tidak tahu jenis aliran apa asalkan menerapkan antarmuka std :: istream.
Pola Pencari Layanan :
Pola locator layanan adalah sedikit variasi pada injeksi ketergantungan. Daripada memberikan objek yang bisa digunakan, Anda memberikannya objek yang tahu cara menemukan (membuat) objek yang ingin Anda gunakan.
class Application
{
public:
Application(Persister& p)
: persistor(p)
{}
void save()
{
std::auto_ptr<SaveDialog> saveDialog = persistor.getSaveDialog();
saveDialog.DoSaveAction();
}
void load()
{
std::auto_ptr<LoadDialog> loadDialog = persistor.getLoadDialog();
loadDialog.DoLoadAction();
}
private:
Persister& persistor;
};
Di sini kita melewati objek aplikasi objek persistor. Ketika Anda melakukan tindakan simpan / muat menggunakan persistor untuk membuat objek yang benar-benar tahu bagaimana melakukan tindakan. Catatan: Sekali lagi persistor adalah sebuah antarmuka dan Anda dapat memberikan implementasi yang berbeda tergantung pada situasinya.
Ini berguna ketika potentially
objek unik diperlukan setiap kali Anda membuat tindakan.
Secara pribadi saya menemukan ini sangat berguna dalam penulisan unit test.
Catatan Pola:
Pola desain adalah subjek besar bagi dirinya sendiri. Ini sama sekali bukan daftar pola eksklusif yang dapat Anda gunakan untuk membantu dengan kopling longgar; ini hanyalah titik awal yang umum.
Dengan pengalaman Anda akan menyadari bahwa Anda sudah menggunakan pola-pola ini hanya saja Anda tidak menggunakan nama formal mereka. Dengan menstandarkan nama mereka (dan membuat semua orang mempelajarinya), kami menemukan bahwa mudah dan cepat untuk mengomunikasikan ide.