Соответствует ли образец в Scala принципу Open / Closed?

Это однострочный, который будет иметь %errorlevel% из 0 для 64-битного, 1 для не-64-разрядных. Я не могу ручаться за то, что он работает со всеми версиями Windows, но демонстрирует один метод его определения. Вы можете добавить несколько запросов findstr, если знаете все возможности поиска.

set | findstr /i processo.*64 > nul 2>&1

В основном вы сбрасываете переменные среды и используете регулярное выражение для поиска чего-то, что имеет «processo« + »64« где-то в своей строке. Трубы предназначены только для подавления соответствующих линий. Если бы я изменил его на set | findstr /i processo.*64 > nul 2>&1 на моей текущей установке, это было бы результатом:

 C:\Windows\System32>set | findstr /i processo.*64
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 158 Stepping 9, GenuineIntel

Это однострочный просмотр, чтобы узнать, работает ли ваш процессор это 64-разрядный AMD

set | findstr /i processo.*amd.*64 > nul 2>&1

. Вы можете принять их как отправную точку и уточнить для своих требований. Я закончил использовать это над известными именами переменных среды из-за того, что он был более надежным в разных основных версиях Windows, с которыми я работал.

13
задан Jeff 18 February 2009 в 23:41
поделиться

3 ответа

Jeff, я думаю, что у Вас есть правильная интуиция: это зависит.

Объектно-ориентированные иерархии классов с виртуальной отправкой метода хороши, когда у Вас есть относительно фиксированный набор методов, которые должны быть реализованы, но много потенциальных подклассов, которые могли бы наследоваться корню иерархии и реализовать те методы. В такой установке относительно легко добавить, новые подклассы (просто реализуют все методы), но относительно трудный добавить новые методы (необходимо изменить все подклассы, чтобы удостовериться, что они правильно реализуют новый метод).

Типы данных с функциональностью на основе сопоставления с образцом хороши, когда у Вас есть относительно фиксированный набор классов, которые принадлежат типу данных, но много потенциальных функций, которые воздействуют на тот тип данных. В такой установке относительно легко добавить новую функциональность для типа данных (просто соответствие шаблона на всех его классах), но относительно трудный добавить новые классы, которые являются частью типа данных (необходимо изменить все функции, которые соответствуют на типе данных, чтобы удостовериться, что они правильно поддерживают новый класс).

каноническим примером для подхода OO является программирование GUI. Элементы GUI должны поддерживать очень мало функциональности (привлекающий себя на экране, абсолютный минимум), но новые элементы GUI добавляются все время (кнопки, таблицы, диаграммы, ползунки, и т.д.). Каноническим примером для подхода сопоставления с образцом является компилятор. Языки программирования обычно имеют относительно фиксированный синтаксис, таким образом, элементы синтаксического дерева будут редко изменяться (если когда-либо), но новые операции на синтаксических деревьях постоянно добавляются (более быстрая оптимизация, более полный анализ типа, и т.д.).

, К счастью, Scala позволяет Вам объединить оба подхода. Классы случая могут и быть подобранным шаблоном и поддерживать виртуальную отправку метода. Регулярные классы поддерживают виртуальную отправку метода и могут быть шаблоном, подобранным путем определения экстрактора в соответствующем сопутствующем объекте. Это до программиста для решения, когда каждый подход является соответствующим, но я думаю, что оба полезны.

22
ответ дан oxbow_lakes 19 February 2009 в 09:41
поделиться
  • 1
    А-ч, я соглашаюсь полностью. Я предполагаю, что пытался сказать " походит на разумную хорошую идею include". я знаю, что текущая операция в секунду связывается с ints так да, она, вероятно, вовлекла бы изменение в набор байт-кода, который является огромной вещью для начала. Обновленный ответ немного. – aioobe 28 February 2011 в 12:56

В то время как я уважаю Cedric, он абсолютно неправ в этой проблеме. Сопоставление с образцом Scala может полностью инкапсулироваться от изменений класса при желании. В то время как это верно, что изменение в класс случая потребовал бы изменения любых соответствующих экземпляров сопоставления с образцом, это только при использовании таких классов наивным способом.

сопоставление с образцом Scala всегда делегаты в deconstructor сопутствующего объекта класса. С классом случая автоматически сгенерирован этот deconstructor (наряду с методом фабрики в сопутствующем объекте), хотя все еще возможно переопределить эту автоматически сгенерированную версию. В любом случае можно утверждать полный контроль над процессом сопоставления с образцом, изолируя любые шаблоны от потенциальных изменений в самом классе. Таким образом сопоставление с образцом является просто другим способом получить доступ к данным класса через безопасный фильтр инкапсуляции, точно так же, как любой другой метод.

Так, мнение доктора Odersky было бы тем для доверия здесь, особенно учитывая чистый объем исследования, которое он провел в области объектно-ориентированного программирования и дизайна.

Что касается того, где это должно использоваться, который является полностью согласно вкусу. Если это делает Ваш код более кратким и удобным в сопровождении, используйте его! Иначе не делать. Для большинства объектно-ориентированных программ сопоставление с образцом является ненужным. Однако, после того как Вы начинаете интегрировать более функциональные идиомы (Option, List, и т.д.) я думаю, что Вы найдете, что сопоставление с образцом значительно уменьшит синтаксические издержки, а также повышение уровня безопасности, предлагаемого системой типов. В целом, любое время, Вы хотите извлечь данные, одновременно тестируя некоторое условие (например, извлекая значение от Some), сопоставление с образцом будет, вероятно, полезно.

16
ответ дан Daniel Spiewak 19 February 2009 в 09:41
поделиться
  • 1
    I' ll также добавляют, что я сделал эту работу для многомерных массивов путем применения q = np.reshape (q, (m, n)), где m и n, где исходные размеры t выстраивают. – sequoia 30 June 2011 в 18:06

Сопоставление с образцом определенно хорошо при выполнении функционального программирования. В случае OO существуют некоторые случаи, где это хорошо. В самом примере Cedric это зависит от того, как Вы просматриваете print() метод концептуально. Действительно ли это - поведение каждого Term объект? Или это - что-то снаружи? Я сказал бы, что это снаружи и имеет смысл делать сопоставление с образцом. С другой стороны, если Вы имеете Employee класс с различными подклассами, это - плохое проектное решение, чтобы сделать сопоставление с образцом на атрибуте его (скажите что имя) в базовом классе.

Также сопоставление с образцом предлагает изящный способ распаковать членов класса.

1
ответ дан amit 19 February 2009 в 09:41
поделиться
Другие вопросы по тегам:

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