Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб. 8 УКПО

.docx
Скачиваний:
0
Добавлен:
25.01.2026
Размер:
732.88 Кб
Скачать

Лабораторная работа №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

Численное значение фактора сцепления между классами достаточно низкий. Следовательно, возможная плотность дефектов ожидается низкой, уровень затрат на доработку и модификацию программы будет небольшой.

Соседние файлы в предмете Управление качеством программного обеспечения