Link Search Menu Expand Document
29 Января 2022 г.

Проектирование программного обеспечения. Базовые понятия

Содержание
  1. Процедуры и функции
  2. Структуры

Зададим базовый набор понятий который будем использовать:

  • Процедура - программа выполняющая свои операции без возврата какого-либо значения.
  • Функция - программа выполняющая свои операции и возвращающая значение.
  • Структура — это объединение нескольких объектов, возможно, различного типа под одним именем, которое является типом структуры.

Процедуры и функции

Например, имеем курс выгруженный из базы данных курс, определим для него процедуру addQuestion которая будет добавлять вопрос к курсу в массив $course.

function addQuestion(&$course, $question){
   if (!in_array($question , $course['questions'])) {
       $course['questions'][] = $question;
   }
}

$course = [
   'name' => 'test name',
   'questions' => [
       'question1',
       'question2',
       'question3',
   ]
];

addQuestion($course, 'question4');
addQuestion($course, 'question5');
addQuestion($course, 'question6');

Все вроде бы удобно, но эта процедура глобальная для всего кода. Так же она работает с массивом $course напрямую, что плохо, исправим это, напишем функцию addQuestionF, которая будет уже возвращать новый объект курса меняя данные внутри.

function addQuestionF($course, $question){
   if (!in_array($question , $course['questions'])) {
       return [
           'name' => $course['name'],
           'questions' => [ ...$course['questions'],  $question ]
       ];
   } else {
       return $course;
   }
}

$course = [
   'name' => 'test name',
   'questions' => [
       'question1',
       'question2',
       'question3',
   ]
];

$newStateCourse = addQuestionF($course, 'question4');

Стало лучше, но с массивами таким образом работать неудобно.

Структуры

Сделаем класс course - где разместим все эти поля, добавим метод addQuestion и заполним объект:

class Course
{
    public string $name;
    public array $questions;

    public function __construct(string $name, array $questions)
    {
        $this->name = $name;
        $this->questions = $questions;
    }
    
    public function addQuestion($question){
        if (in_array($question , $this->questions)) {
            throw new \DomainException('Question( already exists in the course');
        }

        $this->questions[] = $question;
    }
}

$course = new Course('name course',['question1', 'question2', 'question3']);
$course->addQuestion('question4');

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

Структура выше содержит данные и поведение для управления этими данными в одном месте.


Возник вопрос или предложение пиши на почту alexsey_89@bk.ru или в Телеграмм канал

Дата публикации: 29 Января 2022 г.