Сервис-ориентация против объект-ориентации - могут ли они сосуществовать?

Q: Если я зашифрую свои .class-файлы и использую собственный загрузчик классов для загрузки и расшифровки их на лету, это предотвратит декомпиляцию?

A: Проблема предотвращения декомпиляции байт-кода Java почти как старый язык сам. Несмотря на множество инструментов обфускации, доступных на рынке, новички Java-программистов продолжают думать о новых и умных способах защиты своей интеллектуальной собственности. В этом выпуске Java Q & amp; A я развею некоторые мифы вокруг идеи, часто повторяющейся на дискуссионных форумах.

Крайняя легкость, с которой файлы Java .class могут быть восстановлены в источниках Java, которые очень напоминают оригиналы, имеет много, чтобы сделать с Java байт-кода целей дизайна и компромиссов. Помимо всего прочего, байт-код Java был разработан для компактности, независимости платформы, мобильности сети и простоты анализа с помощью интерпретаторов байтового кода и динамических компиляторов JIT (точно в срок) / HotSpot. Возможно, скомпилированные файлы .class выражают намерение программиста настолько четко, что их легче анализировать, чем исходный исходный код.

Можно сделать несколько вещей, если не предотвратить полную декомпиляцию, по крайней мере, сделать это труднее. Например, в качестве этапа после компиляции вы можете массировать данные .class, чтобы код байта был более сложным для чтения, когда декомпилировался или сложнее декомпилировать в действительный код Java (или оба). Методы, такие как выполнение перегрузки по имени экстремального метода, хорошо работают для первого и манипулируют потоком управления для создания структур управления, которые невозможно представить через синтаксис Java, хорошо работают для последнего. Более успешные коммерческие обфускаторы используют сочетание этих и других методов.

К сожалению, оба подхода должны фактически изменить код, который запускает JVM, и многие пользователи боятся (по праву), что это преобразование может добавить новое ошибок в их приложениях. Кроме того, метод и переименование полей могут вызвать обратные вызовы, чтобы перестать работать. Изменение имен реальных классов и пакетов может привести к поломке нескольких других Java-API (JNDI (интерфейс именования и интерфейса Java), поставщиков URL-адресов и т. Д.). В дополнение к измененным именам, если связь между смещениями байтового кода класса и номерами исходных строк изменена, восстановление исходных трасс стека исключений может стать затруднительным.

Тогда есть возможность обфускации исходного источника Java код. Но в корне это вызывает аналогичный набор проблем. Шифрование, а не обфускация?

Возможно, вышесказанное заставило вас подумать: «Ну, а что, если вместо манипулирования байтовым кодом я зашифровываю все мои классы после компиляции и расшифровываю их на лету внутри JVM (что может быть сделанный с помощью специального загрузчика классов)? Тогда JVM выполняет мой исходный байт-код, и все же нет ничего, чтобы декомпилировать или реконструировать, не так ли? »

К сожалению, вы ошибаетесь, думая, что вы были сначала придумать эту идею и подумать, что она действительно работает. И причина не имеет никакого отношения к силе вашей схемы шифрования.

38
задан lbalazscs 6 May 2013 в 15:17
поделиться

6 ответов

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

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

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

9
ответ дан Jesse Pepper 6 May 2013 в 15:17
поделиться

SOA является хорошей архитектурой для передачи между системами или приложениями.

Каждое приложение определяет "сервисный" интерфейс, который состоит из запросов, которые оно обработает и ожидаемый resposes.

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

, Таким образом, Вы свободны реализовать свои сервисы uing все последнее и самое большое OO tequniques или любой другой methodoligy, который работает на Вас. (Я видел крайние случаи, где "сервис" является implmented фактическими людьми, вводящими данные по экрану - все же все было все еще SOA учебника!).

10
ответ дан James Anderson 6 May 2013 в 15:17
поделиться
  • 1
    @DanielGimenez хорошая находка для того тестового сценария! – chakrit 18 September 2013 в 04:43

Мое мнение - то, что SOA может быть полезным на макро-уровне, но каждый сервис, вероятно, все еще будет достаточно большим для необходимости в нескольких внутренних компонентах. Внутренние компоненты могут извлечь выгоду из архитектуры OO.

API SOA должен быть определен более тщательно, чем внутренние API, так как это - внешний API. Типы данных, переданные на этом уровне, должны быть максимально простыми без внутренней логики. Если существует некоторая логика, которая тяготеет к типу данных (например, проверка), должен предпочтительно быть один сервис, отвечающий за выполнение логики на типе данных.

10
ответ дан Avi 6 May 2013 в 15:17
поделиться

Я думаю, что это - неверное толкование объектной ориентации. Даже в Java, методы обычно являются не частью объекты , но их класс (и даже это "членство" не необходимо для объектной ориентации, но это - различный предмет). Класс является просто описанием типа, таким образом, это - действительно часть программы, не данные.

SOA и OO не противоречат друг другу. Сервис может принять данные, организовать их в объекты внутренне, работу над ними, и наконец отдать их в любом формате, желаем.

4
ответ дан Svante 6 May 2013 в 15:17
поделиться
  • 1
    Отличное место! Похож на it' s особый случай, когда один из шаблонов включает один или несколько * с, но другой doesn' t. Отредактировали мой ответ, и скрипка + включала их как дополнительные модульные тесты. – Steve Chambers 18 September 2013 в 11:36

Если Вы позволяете Вашим сервисам помнить состояние, то они могут просто считаться большими объектами с возможно медленным временем вызова.

, Если им не позволяют сохранить состояние тогда, они - как Вы сказали - операторы относительно данных.

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

Принятие SOA делает не средний , выводят все Ваши объекты , но о делении Вашей системы в большие допускающие повторное использование блоки.

3
ответ дан Andy Dent 6 May 2013 в 15:17
поделиться

Я услышал, что James Gosling говорит, что можно было реализовать SOA в КОБОЛе.

при чтении собственного описания Alan Kay источников ООП оно описывает набор небольших компьютеров, взаимодействующих для выполнения чего-то полезного.

Рассматривают это описание:

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

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

я думаю, что следующие замены возможны:

Term      Programing       Architecture
----    ---------------    ------------
  X         Program           System
  Y         Objects          Services
  Z      Data structure      Database
----    ---------------    ------------
result        OOP              SOA

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

4
ответ дан joel.neely 6 May 2013 в 15:17
поделиться