#javascript #typescript
#javascript #typescript
Вопрос:
Я перешел от функционального стиля кодирования Javascript к Typescript на основе классов для работы. Бывают случаи, когда мне нужен только один экземпляр / место для некоторой функциональности, поэтому иногда я выбираю абстрактный класс, в то время как в других случаях я выбираю синглтон. Моя причина выбора одного над другим немного произвольна и размыта, и предложения моих коллег также звучали нечетко.
Когда бы вы использовали абстрактный класс verses, а одноэлементный класс — обычный класс с общедоступными статическими методами и свойствами. Реальные примеры и варианты использования, помогающие решить, когда использовать, что было бы здорово.
В настоящее время abstract и singletons кажутся мне довольно похожими, когда дело доходит до случая создания чего-либо, где есть только один, но моя причина выбора последнего до сих пор заключалась просто в том, что я могу делать this.property
с помощью singlton, тогда как в абстракции кажется правильным использовать только abstractClassName.property
то, что более подробно. Оба кажутся хорошим вариантом для централизации состояния, такого как элемент общего списка таймеров items[]
Комментарии:
1. Что такое «абстрактный класс»? Если вы имеете в виду Typescript
abstract class
, то … нет, это не похоже на хороший вариант использования.2. Поскольку функции являются объектами, это на самом деле не имеет значения (в мире JavaScript). Внутри статических методов класса вы также можете использовать
this
для ссылки на сам класс (опять же, поскольку функции — это просто объекты). В таком случае я бы просто использовал объект (по крайней мере, в обычном JavaScript). Я считаю, что абстрактные классы — это концепция из языков программирования, которые не поддерживают прямое создание объектов. редактировать: Я думал о конечных абстрактных классах. Сами абстрактные классы полезно расширять конкретными классами…3. @FelixKling о сольных проектах Я согласен, что это не имеет значения, но при работе в команде над расширяющимся проектом должны быть веские причины и согласованность используемых шаблонов, отсюда и исходный пост. Я хотел бы услышать некоторые конкретные причины и, возможно, увидеть несколько примеров от кого-то, кто действительно разбирается в теме, конкретно используя Typescript
Ответ №1:
Не используйте класс, если вы не планируете создавать его экземпляр.
Не используйте абстрактный класс, если вы не планируете его расширять.
Обычный объект лучше подходит для набора статических методов. В Typescript вы, вероятно, использовали бы пространство имен или модуль функций.
Комментарии:
1.
Don't use a class if you don't plan to instantiate it.
синглтон создает один экземпляр, и иногда я предпочитаю это абстрактам, потому что я могу ссылаться на его внутренние компоненты с помощьюthis
, вы также можете сделать это с помощью abstracts, но я не думаю, что это семантически корректно, поскольку экземпляра нет.Don't use an abstract class if you don't plan to extend it
на практике абстрактные классы иногда используются для хранения набора методов для формирования служебных классов. Итак, это утверждение не соответствует действительности.2. @timebandit: Точка зрения Берги такова:
const instance = {foo() { console.log(this); } bar() { this.foo(); }}
также создает «экземпляр», без необходимости в классе. В этом преимущество JavaScript. Если у вас есть методы, которым не нужно совместно использовать состояние, используйте вместо этого модуль.3. @FelixKling полностью согласен с вами, я должен уточнить свой вопрос, сказав, что меня интересует объектно-ориентированное решение, которое поняли бы люди, знакомые с Java c #, переходящие на TS
4. @timebandit Ну, для людей, переходящих с Java, все должно быть
class
само собой… Или вы объясняете им, что JavaScript работает по-другому, он основан на объектах, а не на классах. Использование объектных литералов для ваших одиночек с помощью служебных методов — это объектно-ориентированный способ JS.5. @timebandit: Поскольку существует много различий между классами c # / java и JavaScript, знания на самом деле не могут быть переданы IMO. Если им все равно нужно узнать, как работают классы JavaScript, они могли бы также узнать о том, как работают объекты в JavaScript, и использовать их соответствующим образом, пожимая плечами .