Интерфейсы в javascript
Привет.
На вашем сайте читал статью про наследование и ООП. А делал ли кто-то интерфейсы на javascript ? Причём чтобы любой класс мог наследоваться от какого-то другого класса и реализовывать n-ое количество интерфейсов ? |
интерфейсов и классов в JS - нет (но велосипедов реализации до кучи), но наследование есть, такое о котором вы уже прочитали.
|
Мне вот хотя бы один пример велосипеда с интерфейсами посмотреть...
|
Если классы ещё кому-то нужны в JS, то интерфейсы точно не нужны, поэтому и велосипедов нет.
|
Цитата:
интерфейсы: http://knol.google.com/k/programming...r-i-mean-faked http://files.trygve-lie.com/examples...ect_interface/ давно что-то еще читал по этой теме, но где припомнить не могу... Цитата:
Как бы это отрицательно сказалось если бы в JS были интерфейсы? По моему если есть классы, то не использовать интерфейсы не логично. В AS они есть и это же прекрасно, почему бы в JS не реализовать? |
Цитата:
Цитата:
|
Цитата:
Цитата:
interface A { function foo():void; } interface B { function bar():void; } class myClass implements A, B { public function foo():void {} public function bar():void {} } причем, интерфейс может же и выступать как отдельная сущность: public interface A { function fooA():void; } public interface B extends A { function fooB():void; } public interface C { function fooC():void; } public interface D { function fooD():void; } public interface E extends C, D { function fooE():void; } Но JS, мы тоже самое через одно место будем делать, в замен наглядности и минимального использования кода. Kolyaj, только не стоит думать, что меня что-то в JS не устраивает или ограничивает, просто ничего плохого в реализации интерфейсов я не вижу, может по тому, что в я к ним привык в AS и PHP... |
Цитата:
Цитата:
class myClass { public function foo():void {} public function bar():void {} }? |
Цитата:
Во втором случае определяется класс без конструктора, что в AS принято называть реализацией абстрактных методов (хотя их там и нет формально). Я честно не понял вашу мысль, наверно имелось ввиду это? interface myClass { public function foo(param:int = 0):void } class A implements myClass { public function foo(param:int = 1):void {} } |
Ответьте для себя на вопрос: "Зачем в статических языках нужны интерфейсы?". После чего можно будет ответить на другой вопрос "Почему в динамических языках интерфейсы не нужны?".
|
Цитата:
В любом случае найти применения интерфейсам в JS можно, но конкретно для каких проектов можно будет сказать, только тогда когда они появятся. |
Цитата:
Вы так и не ответили, зачем нужны интерфейсы в JS. Приводите куски кода на AS, говоря "ну вот же", а зачем вы их приводите, не говорите. |
классы в js уже есть, по сути... интерфейсы и прочие статические приколы... помимо ответа на твой вопрос, Kolyaj, неискушенный пейсатель может заметить, что это все надо для сферического уменьшения количества ошибок в ПО. Но ведь все мы знаем. Дуглас Наше все Крокфорд сказал, что эти ошибки легко и быстро обнаруживаются, а реальные проблемы создают совсем другого типа недосмотры
а читая предлагаемую спецификацию (старую), создается впечатление, что они хотят сделать javascript статическим и считают, что это круто. Если так нужен статический язык, напишите новый, для серьёзных проектов, зачем поддерживать совместимость с "морально устаревшим" javascript и втыкать в него костыли? В конце концов, объявите actionscript новым стандартом |
Цитата:
В данный момент я стараюсь весь код документировать JSDoc-ами, в следствие чего IDE подсвечивает несоответствие типов исходя из них. |
Цитата:
|
Цитата:
чтобы писать программы на JS, это наверное самый оптимальный вариант. Kolyaj, не удержался)) |
Kolyaj, раз уж зашла тема про JSDoc, не мог бы подсказать, как научить идею генерить их для JavaScript? Что-то никак не могу найти такой плагин.
|
Цитата:
Цитата:
Цитата:
Имеем, например, функцию function foo(arg1, arg2, arg3) { }Пишем перед ней /**, нажимаем enter, получаем /** * * @param arg1 * @param arg2 * @param arg3 */ function foo(arg1, arg2, arg3) { }Описание, типы параметров и тип возвращаемого значения придётся самому писать, тут IDE никак не догадается. Хотя в JetBrains работают чертовски умные люди, не исключаю, что когда-нибудь будет догадываться :) |
Цитата:
А генерить из этого документацию можно? Я жму Generate JavaDoc - не генерит, видимо только для Java. |
Цитата:
Я для проекта на ExtJS генерировал документацию, похожую на extjs-овскую, но там всякие расширения jsdoc-а используются. |
|
а можно развернуть мысль?
|
Попробую более развернуто. Допускаю, выскажу несколько весьма очевидных мыслей.
Интерфейсы суть вариант множественного наследования. Объекты, порожденные от разных классов, но реализующих один интерфейс, имеют одинаковое поведение. А это уже полиморфизм. То есть, разные объекты, наследующие одинаковый интерфейс имеют одинаковый контекст вызова. Не совсем точно, но (как мне кажется) близко по смыслу к идее вызова методов одного объекта в контексте другого. Что и выполняют эти функции. var x = [1.2, 3.4, 5]; var y = ''.split.call(x, /\W/); alert(x); alert(y); |
мысль более-менее понятна, но считаю натянута. Назвать контекстом вызова такую абстрактную сущность как интерфейс... Причем получается, что берем мы метод у конкретного объекта, а вызываем в контексте абстрактного интерфейса. Как-то все вверх ногами
Да и просто, интерфейсы не нужны в javascript. Обоснование. Зачем нужны интерфейсы: 1) возможность работать с разными объектами через один и тот же интерфейс (поддерживается автоматом) 2) проверка типов (бессмысленна в языке с динамической типизацией) 3) некое документирование кода (имхо, имеет смысл только в дополнение к пунктам выше) |
Мои слова не следует понимать буквально. Речь идет, всего лишь, об аналогиях.
Цитата:
|
Если считать, что интерфейсы - это соглашения в коде между разными частями в системе, то имхо они вполне имеют право на существование в js.
Известный факт, что в js часто взаимодействие между разными объектами оборачивается головной болью. Т.о. в js функцией интерфейса могла бы быть просто проверка, что объект реализует заданный набор методов с указанными сигнатурами. Примерно так были реализованы интерфейсы в microsoft ajax - http://www.cristiandarie.ro/asp-ajax/Person3.html. Хотя, в общем-то неудачный пример. Еще интерфейсы вроде есть в php. P.S. Это конечно, если оставить в стороне тот факт, что реализация этого дела поверх js - тот еще костыль |
еще раз, интерфейсы не нужны в языках с динамической типизацией. А головная боль может быть лишь у тех, кто пытается программировать на js, как будто это какой-нибудь java или что еще...
|
Может быть, вы тогда с такой же уверенностью скажете, зачем в языке с динамической типизацией конструкции instanceOf и typeof ?
|
прям в тупик загнали :) Может можете какой-нибудь реальный пример, где бы в js пригодились интерфейсы?
и очень интересует всем кроме меня известный факт про головные боли от взаимодействия объектов? |
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Это не головные боли? Вот отсюда и возникают идеи ввести какие-то соглашения при взаимодейстии объектов |
Я уже писал
Цитата:
|
Цитата:
Вот написал я скрипт, вроде работает.:write: Кинул в папку к остальным исходникам. Через месяц запускаю, а он не работает:D Магия :) |
Цитата:
|
Приведу пример с интерфейсом IDisposable (как в C#), который имеет один метод Dispose.
Пусть у меня есть система, с большим кол-ом различных js классов. Во избежание утечек памяти у меня есть некий Manager для контроля всех ссылок на созданные объекты. Когда какой-то объект мне не нужен я вызываю у него метод Dispose, а будет ли он за собой чистить свои внутренние ресурсы, это уже его проблема. Т.е. здесь возникает такое соглашение: если Manager'у отдаётся на управление какой-то объект, то он должен реализовывать интерфейс IDisposable. Но как уже приводились ссылки в начале обсуждения, нужно просто проверить есть ли такой метод/свойство в объекте и если нету, то как вариант кидать Exception. |
Цитата:
Вы когда ручку на двери не заметите, за какое место хвататься будете, и если не знаете, в какую сторону дверь открывается? :) |
Цитата:
Что так-то проблемы быстро локализовать ни разу не помогает |
Цитата:
if (!obj.Dispose) throw new Error("Метод или свойство не реализовано"); И делать эту проверку в момент когда, один объект отдаётся другому. Тогда с локализацией проблем не будет. |
Цитата:
|
Часовой пояс GMT +3, время: 19:38. |