Поскольку ваша проблема в основном стилистическая (не желая заполнять конструктор кучей объявлений), ее можно решить и стилистически.
На мой взгляд, во многих языках на основе классов конструктор представляет собой функцию, названную в честь самого имени класса. Стилистически мы могли бы использовать это для создания класса ES6, который стилистически все еще имеет смысл, но не группирует типичные действия, выполняемые в конструкторе, со всеми объявлениями свойств, которые мы делаем. Мы просто используем фактический конструктор JS в качестве «области объявления», а затем создаем класс с именем function, который в противном случае мы рассматриваем как область «другого конструктора», вызывая его в конце истинного конструктора.
"use strict"; class MyClass { // only declare your properties and then call this.ClassName(); from here constructor(){ this.prop1 = 'blah 1'; this.prop2 = 'blah 2'; this.prop3 = 'blah 3'; this.MyClass(); } // all sorts of other "constructor" stuff, no longer jumbled with declarations MyClass() { doWhatever(); } }
Оба будут вызываться при создании нового экземпляра.
Что-то вроде двух конструкторов, в которых вы отделяете объявления и другие действия конструктора, которые вы хотите выполнить, и стилистически упрощает понимание того, что происходит тоже.
Я считаю, что это хороший стиль, который нужно использовать при работе с множеством объявлений и / или множеством действий, которые должны произойти при создании экземпляра и которые хотят отличить две идеи друг от друга.
ПРИМЕЧАНИЕ : Я очень целенаправленно не использую типичные идиоматические идеи «инициализации» (например, метод init()
или initialize()
), потому что они часто используются по-разному. Существует некоторая предполагаемая разница между идеей конструирования и инициализации. Работая с конструкторами, люди знают, что они вызываются автоматически как часть реализации. Видя метод init
, многие люди без малейшего взгляда предполагают, что им нужно что-то делать в форме var mc = MyClass(); mc.init();
, потому что именно так вы обычно инициализируете. Я не пытаюсь добавить процесс инициализации для пользователя класса, я пытаюсь добавить в процесс конструирования самого класса.
Хотя некоторые люди могут сделать двойной дубль на мгновение, в этом-то и кроется смысл: они сообщают им, что намерение является частью конструкции, даже если это заставляет их делать двойной дубль и идти «Это не так, как работают конструкторы ES6», и посмотрим на фактический конструктор, чтобы понять: «О, они называют это снизу, я вижу», это гораздо лучше, чем НЕ сообщать об этом намерении (или неправильно сообщать его) и, вероятно, получить многие люди используют его неправильно, пытаясь инициализировать его извне и мусор. Это очень преднамеренно для модели, которую я предлагаю.
Для тех, кто не хочет следовать этому шаблону, может работать и обратное. Передайте объявления в другую функцию в начале. Может быть, назовите его «свойства» или «publicProperties» или что-то. Затем поместите остальные вещи в обычный конструктор.
"use strict"; class MyClass { properties() { this.prop1 = 'blah 1'; this.prop2 = 'blah 2'; this.prop3 = 'blah 3'; } constructor() { this.properties(); doWhatever(); } }
Обратите внимание, что этот второй метод может выглядеть чище, но он также имеет внутреннюю проблему, когда properties
переопределяется, так как один класс, использующий этот метод, расширяет другой. Вы должны были бы дать больше уникальных имен properties
, чтобы избежать этого. Мой первый метод не имеет этой проблемы, потому что его фиктивная половина конструктора имеет уникальное имя в честь класса.
Вы пробовали это:
tar zvPcf /home/test/backups/backup.tar.gz /home/test/backups/../data/
Вы можете попробовать:
tar zvPcf backup.tar.gz ../data/ -C '/ home / test / backups /'
см. Параметр -C.
справочная страница tar дает следующий пример:
tar -xjf foo.tar.bz2 -C bar/
extract bzipped foo.tar.bz2 after changing directory to bar
может быть тем, что вы ищете ...
См. страницу руководства tar (1) .
-C, --directory DIR
переход в каталог DIR