Sobes.tech
Junior — Middle

Клоняш се към използването на наследяване или композиция при проектирането на системи?

sobes.tech AI

Отговор от AI

При проектирането на системи обикновено се предпочита композицията пред наследяването.

Защо?

  • Наследяването създава строга йерархия, която може да доведе до проблеми при промени и усложняване на кода.
  • Композицията позволява създаването на обекти от компоненти, което прави системата по-гъвкава и разширяема.

Например, вместо да създавате клас "Птица" и да наследявате от него "ЛетящаПтица" и "БягащаПтица", по-добре е да създадете клас "Птица", който съдържа обекти за поведение (например, летене, бягане). Така можете динамично да променяте поведението без да променяте йерархията.

В iOS често се използват протоколи и делегати, което е форма на композиция.

Пример на Swift:

protocol Flyable {
    func fly()
}

class Bird {
    var flyingAbility: Flyable?
    func performFly() {
        flyingAbility?.fly()
    }
}

class CanFly: Flyable {
    func fly() {
        print("Аз летя")
    }
}

class CannotFly: Flyable {
    func fly() {
        print("Не мога да летя")
    }
}

let sparrow = Bird()
sparrow.flyingAbility = CanFly()
sparrow.performFly() // Аз летя

let penguin = Bird()
penguin.flyingAbility = CannotFly()
penguin.performFly() // Не мога да летя

Този подход предоставя по-голяма гъвкавост и улеснява поддръжката на кода.