Структуры по сравнению с классами в слое бизнеса.NET

Подумайте об использовании Encryptor4j

Сначала убедитесь, что у вас установлены файлы политики неограниченной юрисдикции , прежде чем продолжить, чтобы вы могли использовать 256-битные ключи AES.

Затем сделайте следующее:

String password = "mysupersecretpassword"; 
Key key = KeyFactory.AES.keyFromPassword(password.toCharArray());
Encryptor encryptor = new Encryptor(key, "AES/CBC/PKCS7Padding", 16);

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

Если это файл, который вы хотите сжать, взгляните на этот ответ Шифрование большого файла с помощью AES с использованием JAVA для еще более простого подхода.

7
задан Shea Daniels 25 June 2009 в 17:54
поделиться

6 ответов

Есть несколько проблем с аргументацией, представленной для описываемого вами шаблона.

Во-первых, структуры не всегда размещаются в стеке . Они выделяются в стеке только тогда, когда являются параметрами или локальными экземплярами внутри метода. Структура, определяемая как член класса, фактически выделяется в куче. Таким образом, аргумент о том, что структура более эффективна из-за меньших усилий по сборке мусора, верен только в определенных узких контекстах.

Во-вторых, любые члены структуры, не являющиеся ValueType, также размещаются в куче (например, струны). Таким образом, даже если структуру можно просто извлечь из стека, любые объекты кучи, на которые она ссылается, все равно должны быть собраны мусором.

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


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

Более того, конкретный случай использования структуры в качестве объекта DTO кажется ошибочным, потому что он вводит ненужную избыточность. Поскольку структуры не могут наследовать другие структуры, вы не можете выражать отношения is-a. Что вы делаете, когда у вас есть Customer, который наследуется от Person. Вы повторяете все свойства Person в структуре Customer? Вкладываете ли вы структуру Person в структуру Customer? Ни один из подходов не идеален. Если бы вы хотя бы использовали классы, вы могли бы сделать так, чтобы Customer расширил Person.

7
ответ дан 6 December 2019 в 10:52
поделиться

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

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

Причина, по которой я говорю, что использование структуры может быть более опасным, заключается в том, что типы значений обрабатываются CLR гораздо иначе, и если они написаны плохо (например, изменяемая структура), это может создать ужасную головную боль. Кроме того, если ваш тип содержит много полей, а затем передается от метода к методу, вы будете копировать каждое поле '

10
ответ дан 6 December 2019 в 10:52
поделиться

Независимо от того, будет ли эта стратегия более эффективной, с ней будет труднее работать, и я бы постарался ее избежать. При этом я сомневаюсь, что это было бы более эффективно. Если бы это было так, компилятор, вероятно, реализовал бы это автоматически. Обычно безопасно полагаться на компилятор для оптимизации на уровне языка.

1
ответ дан 6 December 2019 в 10:52
поделиться

Честно говоря, я впервые слышу о таком подходе.

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

MSDN, где Microsoft опубликовала рекомендации по проектированию структуры .

Классы, о которых говорит ваш преподаватель, легко выходят за рамки 16-байтового правила. И трудно увидеть такую ​​структуру, которая не инкапсулирует бизнес-правила (или, по крайней мере, проверки) в свойствах. На мой взгляд, это был бы довольно дрянной дизайн.

0
ответ дан 6 December 2019 в 10:52
поделиться

Проблема с этим подходом состоит в том, что объекты (экземпляры классов) имеют изменяемое состояние. Структуры, напротив, должны быть неизменными, то есть у них нет состояния, которое можно изменить. В типичном приложении бизнес-уровень активно использует изменение состояния объекта (т.е. рабочие процессы, проверка и т. Д.).

Описанные им преимущества не гарантируют недостатков, которые это принесет.

-2
ответ дан 6 December 2019 в 10:52
поделиться

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

2
ответ дан 6 December 2019 в 10:52
поделиться
Другие вопросы по тегам:

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