История изменений
Исправление Nervous, (текущая версия) :
А теперь представь, что список в JS реализует всё это без парада интерфейсов
Списки в JS из коробки? Любопытно.
А теперь представь, что есть некоторый набор стандартных функций, который работает со списками (ну там filter, map, reduce и всё такое прочее), и тебе надо сделать, чтобы они работали и с твоим пользовательским типом тоже. Ну чтобы не городить этот чёртов map каждый чёртов раз для каждого чёртова нового типа.
Если стандартные функции реализованы в терминах абстракций (например, абстрактных типов данных, спрятанных за некоторым интерфейсом), ты просто реализуешь интерфейсы этих абстракций (условные cons
, first
и rest
для абстрактного списка) в своём типе и откидываешься на спинку кресла, у тебя всё просто работает (тм).
Если же стандартные функции реализованы в терминах одного конкретного типа данных… ты вздыхаешь, запускаешь вим и начинаешь писать my-twisted-set-map. Ну или наследуешься от конкретного типа, который умеет map, со всеми вытекающими. Если тебе это высочайше позволено, конечно.
Исправление Nervous, :
А теперь представь, что список в JS реализует всё это без парада интерфейсов
Списки в JS из коробки? Любопытно.
А теперь представь, что есть некоторый набор стандартных функций, который работает со списками (ну там filter, map, reduce и всё такое прочее), и тебе надо сделать, чтобы они работали и с твоим пользовательским типом тоже. Ну чтобы не городить этот чёртов map каждый чёртов раз для каждого чёртова нового типа.
Если стандартные функции реализованы в терминах абстракций (например, абстрактных типов данных, спрятанных за некоторым интерфейсом), ты просто реализуешь интерфейсы этих абстракций (условные cons
, first
и rest
для абстрактного списка) в своём типе и откидываешься на спинку кресла.
Если же стандартные функции реализованы в терминах одного конкретного типа данных… ты вздыхаешь, запускаешь вим и начинаешь писать my-twisted-set-map. Ну или наследуешься от конкретного типа, который умеет map, со всеми вытекающими. Если тебе это высочайше позволено, конечно.
Исправление Nervous, :
А теперь представь, что список в JS реализует всё это без парада интерфейсов
Списки в JS из коробки? Любопытно.
А теперь представь, что есть некоторый набор стандартных функций, который работает со списками (ну там filter, map, reduce и всё такое прочее), и тебе надо сделать, чтобы они работали и с твоим пользовательским типом тоже. Ну чтобы не городить этот чёртов map каждый чёртов раз для каждого чёртова нового типа.
Если стандартные функции реализованы в терминах абстракций (например, абстрактных типов данных, спрятанных за некоторым интерфейсом), ты просто реализуешь интерфейсы этих абстракций в своём типе и откидываешься на спинку кресла.
Если же стандартные функции реализованы в терминах одного конкретного типа данных… ты вздыхаешь, запускаешь вим и начинаешь писать my-twisted-set-map. Ну или наследуешься от конкретного типа, который умеет map, со всеми вытекающими. Если тебе это высочайше позволено, конечно.
Исправление Nervous, :
А теперь представь, что список в JS реализует всё это без парада интерфейсов
Списки в JS из коробки? Любопытно.
А теперь представь, что есть некоторый набор стандартных функций, который работает со списками (ну там filter, map, reduce и всё такое прочее), и тебе надо сделать, чтобы они работали и с твоим пользовательским типом тоже. Ну чтобы не городить этот чёртов map каждый чёртов раз для каждого чёртова нового типа.
Если стандартные функции реализованы в терминах абстракций (например, абстрактных типов данных, спрятанных за некоторым интерфейсом), ты просто реализуешь интерфейсы этих абстракций в своём типе и откидываешься на спинку кресла.
Если же стандартные функции реализованы в терминах одного конкретного типа данных… ты вздыхаешь, запускаешь вим и начинаешь писать my-twisted-set-map. Ну или наследуешься от конкретного типа, который умеет map, со всеми вытекающими.
Исправление Nervous, :
А теперь представь, что список в JS реализует всё это без парада интерфейсов
Списки в JS из коробки? Любопытно.
А теперь представь, что есть некоторый набор стандартных функций, который работает со списками (ну там filter, map, reduce и всё такое прочее), и тебе надо сделать, чтобы они работали и с твоим пользовательским типом тоже. Ну чтобы не городить этот чёртов map каждый чёртов раз для каждого чёртова нового типа.
Если стандартные функции реализованы в терминах абстракций (например, абстрактных типов данных, спрятанных за некоторым интерфейсом), ты просто реализуешь интерфейсы этих абстракций в своём типе и откидываешься на спинку кресла.
Если же стандартные функции реализованы в терминах одного конкретного типа данных… ты вздыхаешь, запускаешь вим и начинаешь писать my-twisted-set-map.
Исправление Nervous, :
А теперь представь, что список в JS реализует всё это без парада интерфейсов
Списки в JS из коробки? Любопытно.
А теперь представь, что есть некоторый набор стандартных функций, который работает со списками (ну там filter, map, reduce и всё такое прочее), и тебе надо сделать, чтобы они работали и с твоим пользовательским типом тоже. Ну чтобы не городить этот чёртов map каждый чёртов раз для каждого чёртова нового типа.
Если стандартные функции реализованы в терминах абстракций (например, абстрактных типов данных, спрятанных за некоторым интерфейсом), ты просто реализуешь интерфейсы этих абстракций в своём типе и откидываешься на спинку кресла.
Если же стандартные функции реализованы в терминах одного конкретного типа данных… ты вздыхаешь и начинаешь писать my-twisted-set-map.
Исходная версия Nervous, :
А теперь представь, что список в JS реализует всё это без парада интерфейсов
Списки в JS из коробки? Любопытно.
А теперь представь, что есть некоторый набор стандартных функций, который работает со списками (ну там filter, map, reduce и всё такое прочее), и тебе надо сделать, чтобы они работали и с твоим пользовательским типом тоже, чтобы не городить этот чёртов map каждый чёртов раз для каждого чёртова нового типа.
Если стандартные функции реализованы в терминах абстракций (например, абстрактных типов данных, спрятанных за некоторым интерфейсом), ты просто реализуешь интерфейсы этих абстракций в своём типе и откидываешься на спинку кресла.
Если же стандартные функции реализованы в терминах одного конкретного типа данных… ты вздыхаешь и начинаешь писать my-twisted-set-map.