Какие преимущества фабричного конструктора перед автономным фабричным классом или функцией?

Как следует из комментария Ансгара: В Windows Start-Process по умолчанию запускает консольные программы в новом окне консоли , асинхронно .

Если это программа быстро завершается, вы можете увидеть новую вспышку окна консоли только ненадолго, так как она вскоре откроется и скоро закроется, или вы можете вообще пропустить флеш - в любом случае ее вывод не будет отображаться в консоли вызывающего абонента window.

Добавление -Wait к вызову Start-Process вызовет вызов синхронный , а добавление -NoNewWindow заставит его запустить в той же консоли , но сеанс вызова PowerShell не смог бы захватить или перенаправить вывод выведенной программы - см. ниже.

Сделаем шаг назад: не используйте Start-Process если вы хотите запустить консольную программу синхронно , с ее стандартными потоками , подключенными к потокам PowerShell - просто вызовите такую ​​программу прямо :

packages/mdoc/tools/mdoc.exe --version

Если путь / имя внешней программы должен быть указан (поскольку его путь содержит пробелы) и / или хранится в переменной , просто используйте &, оператор вызова, чтобы вызвать его:

# Via a quoted string:
& "packages/mdoc/tools/mdoc.exe" --version

# Via a variable:
$exePath = "packages/mdoc/tools/mdoc.exe"
& $exePath --version

Использование подхода прямого вызова дает вам синхронное выполнение бесплатно, а также возможность захвата и / или перенаправления потоков stdout и stderr вызываемой программы.


Чтобы собрать все это (на основе ваших более поздних комментариев):

nuget install mdoc -OutputDirectory packages -ExcludeVersion

$exePath = "packages/mdoc/tools/mdoc.exe"

& $exePath --version

"done"

Это печатает номер версии - mdoc 5.7.2 на момент написания этой статьи - перед печатью done (проверено в Windows PowerShell v5.1.17134.48 на Microsoft Windows 10 Pro (64-разрядная; Версия 1709, ОС: 16299.371)).


Дополнительное чтение: Запись stdout / stderr выход из внешних программ:

Для захвата stdout , просто назначьте вызов переменной:

$version = & $exePath --version  # $version receives stdout output as an *array of lines*

$version получает либо строковый скаляр (одиночная строка), если только одна строка выводится, либо array строк, представляющих выходные линии.

Чтобы также захватить вывод stderr , используйте перенаправление 2>&1:

[string[]] $allOutput = & $exePath --version 2>&1

Обратите внимание на cast на [string[]], который гарантирует, что строки stderr будут захватываться как строки .

  • По умолчанию они записываются как экземпляры [System.Management.Automation.ErrorRecord], которые в Windows PowerShell будут несколько путать их, как если бы они были PowerShell ошибки - эта проблема была исправлена ​​в PowerShell Core .
  • И наоборот, если вы не преобразуете тип элементов массива, который возвращается в строки, вы может проверить каждый элемент с помощью -is [System.Management.Automation.ErrorRecord], чтобы определить, возникла ли она из stdout или stderr.
0
задан Denis Sablukov 18 January 2019 в 19:30
поделиться

1 ответ

factory позволяет возвращать подтипы, что очень полезно.

Например, вы можете получить factory MyClass.empty => const _EmpytMyClass() и вернуть тривиальную реализацию без хранилища.

Вы также можете использовать его для возврата кэшированных значений, если вы хотите иметь канонические экземпляры вашего класса.

Вы также можете использовать factory для вызова методов для создания ваших экземпляров. Смотрите здесь https://github.com/dart-lang/json_serializable/blob/4033f6ad4e3c96bc2ed16d93c0995e11fcfe42df/example/lib/example.dart#L29

0
ответ дан Kevin Moore 18 January 2019 в 19:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: