Для целей моего проекта мне нужно отправить метрики на AWS.
У меня есть основной класс с именем SendingMetrics.
private CPUMetric _cpuMetric;
private RAMMetric _ramMetric;
private HDDMetric _hddMetric;
private CloudWatchClient _cloudWatchClient(); //AWS Client which contains method Send() that sends metrics to AWS
public SendingMetrics()
{
_cpuMetric = new CPUMetric();
_ramMetric = new RAMMetric();
_hddMetric = new HDDMetric();
_cloudwatchClient = new CloudwatchClient();
InitializeTimer();
}
private void InitializeTimer()
{
//here I initialize Timer object which will call method SendMetrics() each 60 seconds.
}
private void SendMetrics()
{
SendCPUMetric();
SendRAMMetric();
SendHDDMetric();
}
private void SendCPUMetric()
{
_cloudwatchClient.Send("CPU_Metric", _cpuMetric.GetValue());
}
private void SendRAMMetric()
{
_cloudwatchClient.Send("RAM_Metric", _ramMetric.GetValue());
}
private void SendHDDMetric()
{
_cloudwatchClient.Send("HDD_Metric", _hddMetric.GetValue());
}
Также у меня есть CPUMetri c, RAMMetri c и HDDMetri c классы, которые выглядят очень похоже, поэтому я просто покажу код одного класса.
internal sealed class CPUMetric
{
private int _cpuThreshold;
public CPUMetric()
{
_cpuThreshold = 95;
}
public int GetValue()
{
var currentCpuLoad = ... //logic for getting machine CPU load
if(currentCpuLoad > _cpuThreshold)
{
return 1;
}
else
{
return 0;
}
}
}
Итак, проблема, с которой я столкнулся, заключается в том, что чистое кодирование не выполняется в моем примере. У меня есть 3 метрики для отправки, и если мне нужно будет ввести новый показатель c, мне нужно будет создать новый класс, инициализировать его в классе SendingMetrics и изменить этот класс, а это не то, что мне нужно. Я хочу удовлетворить принцип Open Closed, поэтому он открыт для расширений, но закрыт для изменений.
Как правильно это сделать? Я бы переместил эти методы отправки (SendCPUMetri c, SendRAMMetri c, SendHDDMetri c) в соответствующие классы (метод SendCPUMetri c в класс CPUMetri c, SendRAMMEtri c в RAMMetri c, et c), но как изменить класс SendingMetrics, чтобы он был закрыт для изменений, и если мне нужно добавить новую метри c, чтобы не изменять этот класс.