Apakah itu melanggar prinsip OOP jika fungsi anggota tidak menggunakan variabel properti / variabel anggota?
Tidak.
OOP tidak peduli jika fungsi anggota Anda menggunakan, atau tidak menggunakan, properti kelas atau variabel anggota. OOP peduli tentang polimorfisme dan bukan implementasi hard coding. Fungsi statis memiliki kegunaannya tetapi fungsi tidak boleh statis hanya karena tidak bergantung pada keadaan objek. Jika itu pemikiran Anda baik-baik saja, tetapi jangan menyalahkan OOP karena ide itu tidak berasal dari OOP.
Apakah desain yang buruk tidak memanfaatkan variabel anggota?
Jika Anda tidak perlu mengingat status dari panggilan ke panggilan, tidak ada alasan untuk menggunakan status tersebut.
Prinsip desain berorientasi objek mana yang dilanggar?
Tidak ada
Jika fungsi anggota tidak menggunakan variabel anggota maka fungsi anggota itu harus selalu dibuat statis?
Tidak. Pemikiran ini memiliki implikasi panah menuju ke arah yang salah.
Menjadikan fungsi ini statis di sini sepenuhnya terserah Anda. Tapi itu akan membuatnya lebih seperti global jika Anda melakukannya. Sebelum menjadi statis, pertimbangkan untuk menjalankan fungsi di kelas tanpa kewarganegaraan. Ini lebih fleksibel.
Di sini saya memiliki contoh OOP dari fungsi anggota yang tidak menggunakan properti kelas atau variabel anggota.
Fungsi anggota (dan ini adalah kelas tanpa kewarganegaraan) :
#include <iostream>
class Strategy
{
public:
virtual int execute (int a, int b) = 0; // execute() is a so-called pure virtual
// function. As a consequence, Strategy
// is a so-called abstract class.
};
Tiga implementasi yang berbeda:
class ConcreteStrategyAdd:public Strategy
{
public:
int execute(int a, int b)
{
std::cout << "Called ConcreteStrategyAdd's execute()\n";
return a + b;
}
};
class ConcreteStrategySubstract:public Strategy
{
public:
int execute(int a, int b)
{
std::cout << "Called ConcreteStrategySubstract's execute()\n";
return a - b;
}
};
class ConcreteStrategyMultiply:public Strategy
{
public:
int execute(int a, int b)
{
std::cout << "Called ConcreteStrategyMultiply's execute()\n";
return a * b;
}
};
Tempat menyimpan pilihan implementasi:
class Context
{
private:
Strategy* pStrategy;
public:
Context (Strategy& strategy)
: pStrategy(&strategy)
{
}
void SetStrategy(Strategy& strategy)
{
pStrategy = &strategy;
}
int executeStrategy(int a, int b)
{
return pStrategy->execute(a,b);
}
};
Contoh penggunaan
int main()
{
ConcreteStrategyAdd concreteStrategyAdd;
ConcreteStrategySubstract concreteStrategySubstract;
ConcreteStrategyMultiply concreteStrategyMultiply;
Context context(concreteStrategyAdd);
int resultA = context.executeStrategy(3,4);
context.SetStrategy(concreteStrategySubstract);
int resultB = context.executeStrategy(3,4);
context.SetStrategy(concreteStrategyMultiply);
int resultC = context.executeStrategy(3,4);
std::cout << "\nresultA: " << resultA
<< "\nresultB: " << resultB
<< "\nresultC: " << resultC
<< "\n";
}
Output:
Called ConcreteStrategyAdd's execute()
Called ConcreteStrategySubstract's execute()
Called ConcreteStrategyMultiply's execute()
resultA: 7
resultB: -1
resultC: 12
Dan semua tanpa execute()
mempedulikan keadaan objek apa pun. The Strategy
kelas sebenarnya stateless. Hanya status dalam Context
. Objek stateless sangat baik di OOP.
Ditemukan kode ini di sini .