Что означает «утка» (duck) в контексте программирования?

«Что означает «утка» (duck) в контексте программирования?» — вопрос из категории Other, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В программировании "утка" (duck) чаще всего относится к "Утиной типизации" (Duck Typing) — концепции, используемой в динамически типизированных языках (Python, JavaScript, Ruby).

Принцип: "Если что-то ходит как утка и крякает как утка, то это утка". Объект определяется не его классом (типом), а наличием у него определенных методов и свойств.

Пример на Python:

def make_it_quack(duck):
    duck.quack() # Нас не интересует тип объекта, лишь наличие метода .quack()

class RealDuck:
    def quack(self):
        print("Quack!")

class ToyDuck:
    def quack(self):
        print("Squeak!")

class Dog:
    def bark(self):
        print("Woof!")

make_it_quack(RealDuck()) # Работает: "Quack!"
make_it_quack(ToyDuck())  # Работает: "Squeak!"
# make_it_quack(Dog())    # Ошибка: у Dog нет метода .quack()

В статически типизированных языках (Java, C#) этот принцип эмулируется с помощью:

  1. Интерфейсов: Определяют контракт (метод quack()).
  2. Шаблона проектирования "Адаптер".

Пример на Java:

interface Quackable {
    void quack();
}

class MallardDuck implements Quackable {
    public void quack() { System.out.println("Quack"); }
}

class RubberDuck implements Quackable {
    public void quack() { System.out.println("Squeak"); }
}

class DuckSimulator {
    static void simulate(Quackable duck) { // Принимаем любой объект, реализующий интерфейс
        duck.quack();
    }
    public static void main(String[] args) {
        simulate(new MallardDuck()); // Quack
        simulate(new RubberDuck());  // Squeak
    }
}