Теория 📔
July 29

Принцип наименьшего удивления

Принцип наименьшего удивления (Principle of Least Astonishment, PLA) гласит, что компоненты системы должны вести себя так, как ожидает пользователь или разработчик. Если код или интерфейс ведут себя неожиданно, это может привести к ошибкам и разочарованию.

Рассмотрим пример с сервисом в Angular, который нарушает принцип наименьшего удивления, и затем исправим его.

// my-service.ts
import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class MyService {
  getData() {
    // Возвращает данные в виде строки, что может быть неожиданным
    return "Some data";
  }
}

// my-component.ts
import { Component, OnInit } from '@angular/core';
import { MyService } from './my-service';

@Component({
  selector: 'app-my-component',
  template: '<p>{{ data }}</p>'
})
export class MyComponent implements OnInit {
  data: any;

  constructor(private myService: MyService) {}

  ngOnInit() {
    this.data = this.myService.getData();
    // Ожидание: this.data будет объектом, реальность: строка
    console.log(typeof this.data); // "string"
  }
}

В этом примере метод getData сервиса MyService возвращает строку. Ожидается, что метод, начинающийся с get, вернет объект или данные в более структурированном виде, например, массив или объект.

// my-service.ts
import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class MyService {
  getData() {
    // Возвращает данные в виде объекта
    return { message: "Some data" };
  }
}

// my-component.ts
import { Component, OnInit } from '@angular/core';
import { MyService } from './my-service';

@Component({
  selector: 'app-my-component',
  template: '<p>{{ data.message }}</p>'
})
export class MyComponent implements OnInit {
  data: { message: string };

  constructor(private myService: MyService) {}

  ngOnInit() {
    this.data = this.myService.getData();
    // Ожидание совпадает с реальностью: this.data - объект
    console.log(typeof this.data); // "object"
  }
}

Теперь метод getData возвращает объект. Это соответствует ожиданиям и уменьшает вероятность неожиданного поведения и ошибок.