Вы находитесь на странице: 1из 6

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ

ФЕДЕРАЦИИ
Севастопольский Государственный Университет
кафедра Информационных систем

Глотов М.В.

Институт информационных технологий и управления в технических


системах
Курс 4 группа ИC(б) – 41
09.03.02 Информационные системы (уровень бакалавриата)

ОТЧЕТ
о лабораторном практикуме №1
по дисциплине «Рефакторинг программного обеспечения»
на тему: «Рефакторинг программного кода. Составление методов»

Отметка о зачете ____________________ __________


(дата)

Руководитель практикума

__________ __________ Строганов В.А.


(должность) (подпись) (фамилия, инициалы)

Севастополь
2019
1 ЦЕЛЬ РАБОТЫ

Исследовать эффективность составления методов при рефакторинга


программного кода. Получить практические навыки применения приемов
рефакторинга методов.

2 ЗАДАНИЕ НА РАБОТУ

2.1. Выбрать фрагмент программного кода для рефакторинга.


2.2. Выполнить рефакторинг программного кода.
2.3. Составить отчет, содержащий подробное описание каждого
модифицированного фрагмента программы и описание использованного
метода рефакторинга.

3 ХОД РАБОТЫ

Ниже приведен код метода, выполняющего построение матрицы


транзитивности.

static buildTransitionMatrix(struct){
/*БЛОК 1*/
var arr = this.getBasicComponents(struct);
var dictionary = this._getDictionary(arr);
var transitionMatrix = [];

for(let i = 0; i < dictionary.length; i++){


transitionMatrix[i] = new Array(arr[arr.length-1].postmain[0]);
}

/*БЛОК 2*/
for(let i = 0; i < arr.length; i++){

var symbol = arr[i].value;


var index = this._getIndexBySymbolInDictionary(dictionary, symbol);

arr[i].premain.forEach(function(item){
if(transitionMatrix[index][item] === undefined){
transitionMatrix[index][item] = {
states: [],
};
}
Structure._push(transitionMatrix[index][item].states, [arr[i].postmain[0]]);
});
}

/*БЛОК 3*/
var sygnals = [];
sygnals[0] = "start";
var amount = 1;
for(let i = 0; i < arr.length; i++){
if(arr[i].postmain[0] >= amount && arr[i].endPlace){
sygnals[amount] = "end";
amount++;
}else if(arr[i].postmain[0] >= amount && !arr[i].endPlace){
sygnals[amount] = "working";
amount++;
}
}

return {
matrix: transitionMatrix,
sygnals: sygnals,
};
}
3.1 Выделение метода

Видно, что блок 3 можно выделить в отдельный метод:


static _getSygnals(arr){
var sygnals = [];
sygnals[0] = "start";
var amount = 1;
for(let i = 0; i < arr.length; i++){

if(arr[i].postmain[0] >= amount && arr[i].endPlace){


sygnals[amount] = "end";
amount++;
}else if(arr[i].postmain[0] >= amount && !arr[i].endPlace){
sygnals[amount] = "working";
amount++;
}
}
return sygnals;
}

При этом код блока 3 заменим на строку:


/*БЛОК 3*/
var sygnals = this._getSygnals(arr);

3.2 Введение поясняющей переменной

В блоке 1, в цикле, можно применить метод введения поясняющей переменной


(columnsAmount). Пришли к следующему результату:

var columnsAmount = arr[arr.length-1].postmain[0];


for(let i = 0; i < dictionary.length; i++){
transitionMatrix[i] = new Array(columnsAmount);
}

3.3 Расщепление поясняющей переменной

В блоке 2 можно применить метод расщепления поясняющей переменной


(symbol). В итоге пара исходных строк:

var symbol = arr[i].value;


var index = this._getIndexBySymbolInDictionary(dictionary, symbol);

заменится на:
var index = this._getIndexBySymbolInDictionary(dictionary, arr[i].value);

3.4 Встраивание метода

В методе indexPlaces() можно применить встраивание метода.

static indexPlaces(struct){
this.markEndPlaces(struct);
this._indexPlaces(struct);
var startPlace = [0];
this.markPlaces(struct, startPlace);
}

В результате получили:
static indexPlaces(struct){
this._firstMarkingStep(struct);
this._secondMarkingStep(struct);
this._indexPlaces(struct);
var startPlace = [0];
this.markPlaces(struct, startPlace);
}

3.5 Замена временной переменной вызовом метода

В методе buildTransitionMatrix() присутствует следующий код:


return {
matrix: transitionMatrix,
sygnals: sygnals,
};

В данном случае sygnals можно заменить на вызов метода. После того, как
проделали это, получили следующий код, причем совершенно избавились от
блока 3:
return {
matrix: transitionMatrix,
sygnals: this._getSygnals(arr),
};

3.6 Замещение алгоритма

Пусть дан код на языке JavaScript, который отвечает за слайдер на веб


странице:
initNumber = 1;
initNumber2 = 2;
initNumber3 = 3;

var leftbutton = document.getElementById('leftbutton');


leftbutton.addEventListener('click',sliderleft);

function sliderleft(){
var slider_object_1 = document.getElementById('slider_object_1');
var slider_object_2 = document.getElementById('slider_object_2');
var slider_object_3 = document.getElementById('slider_object_3');
initNumber ++;
initNumber2 ++;
initNumber3 ++;
if(initNumber>3){
initNumber = 1;
}
if(initNumber2>3){
initNumber2 = 1;
}
if(initNumber3>3){
initNumber3 = 1;
}
slider_object_1.setAttribute('src', 'img/' + initNumber +".PNG");
slider_object_2.setAttribute('src','img/' + (initNumber2) +".PNG");
slider_object_3.setAttribute('src','img/' + (initNumber3) +".PNG");
}

Данный код можно переписать, используя другой алгоритм. Данный


алгоритм меньше и понятнее предыдущего:

const slider = document.querySelectorAll('.slider__img'),


btnBack = document.querySelector('.btn-back'),
btnForward = document.querySelector('.btn-forward');

let currentSlide = 0;

function CulcSlide(n) {
slider[currentSlide].classList.remove("img-active");
currentSlide = (n + slider.length) % slider.length;
slider[currentSlide].classList.add("img-active");
}

setInterval(() => {
CulcSlide(currentSlide + 1);
}, 3000);

btnForward.addEventListener('click', e => {
CulcSlide(currentSlide + 1);
});

btnBack.addEventListener('click', e => {
CulcSlide(currentSlide - 1);
});

4 ВЫПОЛНЕНИЕ ТЕСТОВ

Рисунок 4.1 – Выполнение тестов после рефакторинга


ВЫВОДЫ

В ходе выполнения лабораторной работы была проведен рефакторинг


программного кода некоторых из методов. В ходе проведения рефакторинга
использовались следующие методы: выделение метода, введение поясняющей
переменной, расщепление поясняющей переменной, встраивание метода,
замена временной переменной вызовом метода.
Помимо использованных методов существует также метод замены
алгоритма, применяющийся тогда, когда код всего метода написан непонятно.
Существует также замена метода объектом методов, когда код выделяется в
метод отдельного класса. Также существует метод, позволяющий избавиться
от присваивания значений параметрам метода.