Лаб. 8 УКПО
.docxЛабораторная работа №8
Метрики Абреу
using System;
class BaseTariff
{
protected double sd; // стоимость 1 кВтч днем
protected double sn; // стоимость 1 кВтч ночью
public BaseTariff(double sd, double sn)
{
this.sd = sd;
this.sn = sn;
}
public virtual void PrintInfo()
{
Console.WriteLine("Базовый тариф: Дневная = " + sd + ", Ночная = " + sn);
}
}
// Квартира с электроплитой
class FlatElectro : BaseTariff
{
double sdm; // дневной расход за месяц
double snm; // ночной расход за месяц
double koef; // коэффициент снижения стоимости
public FlatElectro(double sd, double sn, double sdm, double snm, double koef)
: base(sd, sn)
{
this.sdm = sdm;
this.snm = snm;
this.koef = koef;
}
public override void PrintInfo()
{
double payment = (sd * sdm + sn * snm) / koef;
Console.WriteLine("Тип: Квартира с электроплитой");
Console.WriteLine($"Плата за месяц: {payment:F2} руб.");
Console.WriteLine("--------------------------------");
}
}
// Квартира с газовой плитой
class FlatGas : BaseTariff
{
double sdmGaz; // дневной расход
double snmGaz; // ночной расход
public FlatGas(double sd, double sn, double sdmGaz, double snmGaz)
: base(sd, sn)
{
this.sdmGaz = sdmGaz;
this.snmGaz = snmGaz;
}
public override void PrintInfo()
{
double payment = sd * sdmGaz + sn * snmGaz;
Console.WriteLine("Тип: Квартира с газовой плитой");
Console.WriteLine($"Плата за месяц: {payment:F2} руб.");
Console.WriteLine("--------------------------------");
}
}
class Program
{
static void Main()
{
Console.Write("Введите стоимость 1 кВтч днем: ");
double sd = Convert.ToDouble(Console.ReadLine());
Console.Write("Введите стоимость 1 кВтч ночью: ");
double sn = Convert.ToDouble(Console.ReadLine());
Console.Write("Сколько объектов хотите создать? ");
int n = int.Parse(Console.ReadLine());
BaseTariff[] arr = new BaseTariff[n];
for (int i = 0; i < n; i++)
{
Console.WriteLine($"\nОбъект #{i + 1}");
Console.WriteLine("1 - Квартира с электроплитой");
Console.WriteLine("2 - Квартира с газовой плитой");
Console.Write("Ваш выбор: ");
int type = int.Parse(Console.ReadLine());
if (type == 1)
{
Console.Write("Дневной расход (кВт): ");
double sdm = Convert.ToDouble(Console.ReadLine());
Console.Write("Ночной расход (кВт): ");
double snm = Convert.ToDouble(Console.ReadLine());
Console.Write("Коэффициент льготы (koef): ");
double koef = Convert.ToDouble(Console.ReadLine());
arr[i] = new FlatElectro(sd, sn, sdm, snm, koef);
}
else if (type == 2)
{
Console.Write("Дневной расход (кВт): ");
double sdmGaz = Convert.ToDouble(Console.ReadLine());
Console.Write("Ночной расход (кВт): ");
double snmGaz = Convert.ToDouble(Console.ReadLine());
arr[i] = new FlatGas(sd, sn, sdmGaz, snmGaz);
}
else
{
Console.WriteLine("Неверный тип! Повторите ввод.");
i--;
}
}
Console.WriteLine("\n========== Результаты ==========");
foreach (var item in arr)
{
item.PrintInfo();
}
}
}
Фактор закрытости метода (МHF):
Класс BaseTariff:
– т.к. все методы открыты
– всего методов
Класс FlatElectro:
– т.к. все методы открыты
– всего методов
Класс FlatGas:
– т.к. все методы открыты
– всего методов
Класс Program:
– т.к. Main по умолчанию открыт
– всего методов
Таким образом MHF = (0 + 0 + 0 + 0) / (2 + 2 + 2 + 1) = 0
Решение задачи не имеет закрытых методов.
Фактор закрытости свойства (AHF):
Класс BaseTariff:
– т.к. все поля protected
– всего полей
Класс FlatElectro:
– т.к. все
поля private
– всего полей
Класс FlatGas:
– т.к. все поля private
– всего полей
Класс Program:
Поля не определены
Таким образом AHF = (2 + 3 + 2 + 0) / (2 + 3 + 2 + 0) = 1
Закрытость полей всех классов программы составляет 100% - идеальный случай.
Фактор наследования метода (MIF):
Класс BaseTariff:
– нет унаследованных методов
– нет унаследованных методов
– количество неунаследованных методов
– количество методов, определённых в
классе
– количество методов, доступных в классе
Класс FlatElectro:
– количество унаследованных и непереопределённых методов
– количество унаследованных и
переопределённых методов
– количество неунаследованных методов
– количество методов, определённых в
классе
– количество методов, доступных в классе
Класс FlatGas:
– количество унаследованных и непереопределённых методов
– количество унаследованных и переопределённых методов
– количество неунаследованных методов
– количество методов, определённых в классе
– количество методов, доступных в классе
Класс Program:
– нет унаследованных методов
– нет унаследованных методов
– количество неунаследованных методов
– количество методов, определённых в
классе
– количество методов, доступных
Таким образом MIF = сумма(
)
/ cумма(
)
= (0 + 0 + 0 + 0) / (2 + 2 + 2 + 1) = 0
Нулевое значение говорит о том, что отсутствует эффективное наследование.
Фактор наследования свойства (AIF):
Класс BaseTariff:
– нет унаследованных полей
– нет унаследованных полей
– количество неунаследованных полей
– количество полей, определённых в
классе
– количество полей, доступных в классе
Класс FlatElectro:
– количество унаследованных и
непереопределённых полей
– количество унаследованных и переопределённых полей
– количество неунаследованных полей
– количество полей, определённых в
классе
– количество полей, доступных в классе
Класс FlatGas:
– количество унаследованных и непереопределённых полей
– количество унаследованных и переопределённых полей
– количество неунаследованных полей
– количество полей, определённых в классе
– количество полей, доступных в классе
Класс Program:
Поля не определены и наследником не является
Таким образом AIF = сумма(
)
/ cумма(
)
= (0 + 2 + 2 + 0) / (2 + 5 + 4 + 0) = 0,36
Фактор полиморфизма (POF):
Класс BaseTariff:
DC = 2 – количество потомков
Класс FlatElectro:
DC = 0 – количество потомков
Класс FlatGas:
DC = 0 – количество потомков
Класс Program:
DC = 0 – количество потомков
Таким образом POF = сумма(
)
/ cумма(
)
= (0 + 1 + 1 + 0) / (2*2 + 1*0 + 1*0 + 1*0) = 0,5
Уровень полиморфизма программы составляет 50%, что может привести к повышенным трудозатратам при модификации программы.
Фактор сцепления (COF):
Класс BaseTariff:
Отсутствуют ссылки на свойства и методы других классов.
Все комбинации is_client равны 0.
Класс FlatElectro:
Отсутствуют ссылки на свойства и методы других классов.
Все комбинации is_client равны 0.
Класс FlatGas:
Отсутствуют ссылки на свойства и методы других классов.
Все комбинации is_client равны 0.
Класс Program:
Имеются ссылки на методы всех поставщиков.
Все 3 комбинации is_client равны 1.
TC = 4 – количество классов.
Таким образом COF = сумма(is_client) / (TC^2 – TC) = (0 + 0 + 0 + 3) / (16 – 4) = 0,25
Численное значение фактора сцепления между классами достаточно низкий. Следовательно, возможная плотность дефектов ожидается низкой, уровень затрат на доработку и модификацию программы будет небольшой.
