Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> По умолчанию структуры вместо классов? 
:(
    Опции темы
slavaentp
Дата 28.1.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 17.6.2008

Репутация: нет
Всего: -1



Я в одной книге как-то прочитал "правило Буравчика" про уровень доступа - "Лучше всего члены класса делать как private, и только если этот уровень доступа не устраивает - постепенно его повышать.

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

В связи с этиа вопрос - можно ли сказать, что когда пишешь программу, лучше вначале использовать структуры и только если они вдруг не устраивают - менять их на классы?
PM MAIL   Вверх
QryStaL
Дата 28.1.2009, 17:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 10
Всего: 32



Цитата(slavaentp @  28.1.2009,  17:09 Найти цитируемый пост)
можно ли сказать, что когда пишешь программу, лучше вначале использовать структуры и только если они вдруг не устраивают - менять их на классы?


Classes are reference types and structures are value types. Reference types are allocated on the heap, and memory management is handled by the garbage collector. Value types are allocated on the stack or inline and are deallocated when they go out of scope. In general, value types are cheaper to allocate and deallocate. However, if they are used in scenarios that require a significant amount of boxing and unboxing, they perform poorly as compared to reference types. 

Consider defining a structure instead of a class if instances of the type are small and commonly short-lived or are commonly embedded in other objects.
Do not define a structure unless the type has all of the following characteristics:

- It logically represents a single value, similar to primitive types (integer, double, and so on).
- It has an instance size smaller than 16 bytes.
- It is immutable.
- It will not have to be boxed frequently. 
- If one or more of these conditions are not met, create a reference type instead of a structure. Failure to adhere to this guideline can negatively impact performance.


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
PashaPash
Дата 28.1.2009, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Цитата(slavaentp @  28.1.2009,  17:09 Найти цитируемый пост)
Я сейчас читаю про структуры и про то, что их использование может сэкономить память, которую занимает программа, т.к. по 100 раз не выделяется область управляемой кучи для каждого экземпляра, если используешь структуру.

Под класс память выделяется ровно один раз. А под структуру - минимум один раз, а при активной работе - еще много-много раз.


--------------------
PM MAIL WWW   Вверх
Grok
Дата 29.1.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 17.12.2007

Репутация: нет
Всего: нет



подпишусь под QryStaL и PashaPash, классы передаются по ссылке, а структуры по значению. 
Структуры например селесообразно использовать когда нужно обьеденить несколько "примитивных" данных в одну конструкцию. 



Это сообщение отредактировал(а) Grok - 30.1.2009, 17:10
PM MAIL ICQ   Вверх
Vex
Дата 1.2.2009, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


кацапосрачмученiкъ
****


Профиль
Группа: Экс. модератор
Сообщений: 3103
Регистрация: 28.3.2002
Где: strawberry fields

Репутация: нет
Всего: 88



Цитата

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


для структуры память выделяется не в куче, а  в стеке.

по поводу экономии памяти:
при копировании структуры у тебя как раз будет выделяться память для еще одного экземпляра.
при копировании класса (экземпляра) - только ссылка на него.


--------------------
Слава Україні.
PM   Вверх
thomas
Дата 4.2.2009, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



Привет всем.
Можно и мне добавить свои пять копеек про структуры и их использование.

Представте себе трехуровневую архитектуру приложения.
Т.е. имеем три уровня: уровень данных, уровень бизнес логики и уровень представления.
При этом уровень бизнес логики имеет референс на уровень данных, а уровень представления имеет референс на уровень бизнес логики.

        Уровень представлени (user interface - GUI)

    Уровень бизнес логики (классы бизнес обьектов BL )

Уровень данных (классы для работы с хранилищем данных DAL)

Представили? 
Так вот, рассмотрим взаимодействие двух нижних уровней. 
Из самого нижнего слоя вы не видите ничего кроме хранилища данных(ни BL ни GUI). Задача этого слоя организовать доступ к хранилищу данных и методы работы с ним: вставка, чтение, изменение и удаление данных.
Из вторго слоя (BL) вы видите только обьекты нижнего слоя (DAL), но выше стоящий слой (GUI) вы не видите. 
Соответственно из самого верхнего слоя вы видите обьекты второго слоя (BL) и не видите обьекты самого нижнего слоя (DAL).
Теперь самое интересное: как организовать взаимодействие между первым и вторым слоями нашего приложения? Как DAL может обмениваться данными с BL. Ведь из слоя бизнес логики мы должны передавать данные на обработку в слой данных и получать их обратно через слой данных их хранилища данных. При этом слой бизнес логики совершенно не должен знать что там происходит с данными на нижнем слое, с каким хранилищем данных он работает, с  XML, с MS SQL или MySQL или Oracl. Используются там хранимые процедуры или пишутся SQL команды слою бизнес логики ЗНАТЬ совсем не к чему. 
И вот мы подошли к тому, с чего начинали, к СТРУКТУРАМ. Исходя из того что, обьект - класс из слоя бизнес логики невозможно прописать в качестве входного параметра в метод класса слоя данных, можно и нужно использовать структуры в качестве параметров для методов классов слоя данных.
Как это выглядит?
С слое данных создаете структуру и класс, ну например, который создает соединение с БД на сервере и предоставляет стандартные методы для вставки изменения и удаления данных в таблицу БД.
В слое бизнес логики создаете класс описывающий обьект бизнес логики, ну например клиент, и предоставляющий методы для работы с ним. Ну например самый простой: в таблице базы данных отдельно предусмотрены поля для имени, отчества и фамилии. Наш класс имеет соответственно три свойства. А мы хотим иметь ФИО полностью, т.е. пишем метод выдающий ФИО.
Теперь самое интересное. Для вызова методов класса из слоя данных в классе слоя бизнес логики создается экземпляр этого класса в конструкторе . Далее нам надо создать нового клиента. В методе сохранить вызываем структуру, присваиваем значения её полям и в экземпляре сласса слоя данных вызываем соответствующий метод и в качестве параметра передаем ему заполненную структуру.
А уже там внизу из этой структуры извлекут данные вставят их в соответствующие SQL команды и передадут их на выполнение.

Соответственно поля структуры должны соответствовать по типу полям класса бизнес логики.


 




Это сообщение отредактировал(а) thomas - 4.2.2009, 00:54


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
PashaPash
Дата 4.2.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



thomas, да, паттерн "доменная модель" на пальцах - это круто, но при чем тут структуры? Классы тоже вполне справляются. И без выжирания доп памяти на каждом "качестве параметра передаем". Если совсем точно - то вот как раз в доменной можели структуры лучше не использовать, т.к. сразу отпадают все возможные бонусы типа Identity Tracking и Lazy Load.
А то как в анекдоте: Рыба - животное, живет в воде, покрыто чешуей. Но если бы оно было покрыто шерстью, в шерсти жили бы блохи...
Цитата(thomas @  4.2.2009,  00:51 Найти цитируемый пост)
Исходя из того что, обьект - класс из слоя бизнес логики невозможно прописать в качестве входного параметра в метод класса слоя данных, можно и нужно использовать структуры в качестве параметров для методов классов слоя данных.

Невозможно прописать в качестве входного параметра в метод класса слоя данных - возможно, нужно, и прописывают. Эта мегапробема отлично решается выносом объектов бизнес логики - BE - в отдельную сборку. Но уж точно не дублированием всех классов BE в виде структур.

UPD: Официальный гайд от производителя (с)
Цитата(App Arch Guide)

Chapter 9: Layers and Tiers
...
Business Entities Used by Data and Business Services
There are many cases where business entities must be accessible to components and services in
both the business layer and the data layer. For example, business entities can be mapped to the
data source and accessed by business components. However, you should still separate business
logic from data access logic. You can achieve this by moving business entities into a separate
assembly that can be shared by both the business services and data services assemblies, as
shown in Figure 5. This is similar to using a dependency inversion pattern, where business
entities are decoupled from the business and data layer so that both business and data layers
are dependent on business entities as a shared contract.


Это сообщение отредактировал(а) PashaPash - 4.2.2009, 10:47


--------------------
PM MAIL WWW   Вверх
mihryak
Дата 4.2.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



согласен полностью с PashaPash, дублирование ни к чему хорошему не приведет, задолбаетесь поддерживать соответствие между структурой и классом
общепринятая практика - выносить доменные объекты в одну общую сборку
PM MAIL ICQ   Вверх
kemiisto
Дата 4.2.2009, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(PashaPash @  28.1.2009,  17:00 Найти цитируемый пост)
Под класс память выделяется ровно один раз. А под структуру - минимум один раз, а при активной работе - еще много-много раз. 

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

Цитата(Vex @  1.2.2009,  09:04 Найти цитируемый пост)
при копировании класса (экземпляра) - только ссылка на него. 

Толька такую операцию называть копированием объекта будет как раз таки неверно. Это именно копирование ссылки на объект, а если хотите скопировать объект - 
Цитата(Vex @  1.2.2009,  09:04 Найти цитируемый пост)
будет выделяться память для еще одного экземпляра


Вообще, топикстартер слышит звон, но ... На самом деле структуры (или записи) в современных мейнстрим языках  - это как бы "недообъекты". Им не хватает методов, да и память под них не там выделяется. Есть два альтернативных подхода:
  •  применённый Виртом в языках семейства OBERON, т.н. механизм расширения записей. Т.е. нет даже такого ключевого слова OBJECT. Есть только RECORD. Можно объявлять как обычные записи, так и расширяемые (т.е. дополнять их методами).
  •  приенённый Аланом Кейем в Smalltalk. Труъ ООП, так сказать. Всё есть объект. Нет никаких примитивных типов, boxing/unboxing, ...

Вот это, что называется правильный дизайн языка. И OBERON, и Smalltalk. А C# (Java, Delphi, ...) так и тащать за собой тяжёлое наследство прошлого, родившееся из ускоренных попыток Страуструпа побыстрее внедрить в С объекты, природу которых он тогда ещё не очень то понимал. Но свои ошибки признавать умеют очень немногие... 

P.S. Сорри за оффтоп...


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Partizan
Дата 4.2.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



Цитата

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


kemiisto,  Ну понятно же, что речь шла именно об объектах ;) В компетенции PashaPash сомнений никаких не возникает smile


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PashaPash
Дата 4.2.2009, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Цитата(kemiisto @  4.2.2009,  18:35 Найти цитируемый пост)
Это как так? Хотя из того, что у Вас память под класс выделяется, а не под экземпляр можно сделать определённые выводы...

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

Добавлено через 1 минуту и 18 секунд
Цитата(kemiisto @  4.2.2009,  18:35 Найти цитируемый пост)
...Им не хватает методов...

Из этого заявления тоже можно сделать далеко идущие выводы...


--------------------
PM MAIL WWW   Вверх
kemiisto
Дата 4.2.2009, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(Partizan @  4.2.2009,  16:41 Найти цитируемый пост)
kemiisto,  Ну понятно же, что речь шла именно об объектах ;) В компетенции PashaPash сомнений никаких не возникает

Ну и троллинг исчо никто не отменял! smile 

Цитата(PashaPash @  4.2.2009,  16:53 Найти цитируемый пост)
Из этого заявления тоже можно сделать далеко идущие выводы... 

Ага! Вот только сделал их, пожалуй, один Вирт! Бритва Окама, однако. smile 

PashaPash, не заводись! Я, возможно, иногда бываю резок, не надо так вот сразу принимать на свой счёт и сгущать краски. smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
PashaPash
Дата 4.2.2009, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Цитата(kemiisto @  4.2.2009,  19:44 Найти цитируемый пост)

Ага! Вот только сделал их, пожалуй, один Вирт! Бритва Окама, однако. smile 

Лично мне система типов .NET (с методами у структур и у примитивных типов) нравится намного больше, чем в Java, где примитивным типам пообрезали много чего этой самой бритвой. Оба "чистых" подхода на практике вызывают неудобства в определенных задачах. На чисто-ООП языке с железом эффективно не поработаешь. А на рекордах - чистых структурах - не напишешь крупный проект.
На C# можно писать в pure-OOP стиле, просто забыть про слово struct. Или клепать километры кода с чистыми структурами. Что плохого в возможности выбора?
Цитата(kemiisto @  4.2.2009,  19:44 Найти цитируемый пост)
PashaPash, не заводись! Я, возможно, иногда бываю резок, не надо так вот сразу принимать на свой счёт и сгущать краски. 

Ну можно ж потроллить... smile


--------------------
PM MAIL WWW   Вверх
kemiisto
  Дата 5.2.2009, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(PashaPash @  4.2.2009,  18:08 Найти цитируемый пост)
На чисто-ООП языке с железом эффективно не поработаешь. А на рекордах - чистых структурах - не напишешь крупный проект.

С первым - скорее соглашусь, второе - считаю спорным. Взять хотя бы GNOME 2.0.

P.S. Partizan, с назначением! smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
PashaPash
Дата 5.2.2009, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Цитата(kemiisto @  5.2.2009,  10:46 Найти цитируемый пост)

С первым - скорее соглашусь, второе - считаю спорным. Взять хотя бы GNOME 2.0.

Шанс успешно написать крупный проект намного меньше smile За это время куча проектов, использующих плюшки ООП, догонят, перегонят и вытеснят с рынка. А авторы гнома - экстремалы.


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0629 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.