Дружественные и приватные классы

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Дружественные и приватные классы

Сообщение Brainenjii » 16.03.2012 16:08:38

Есть что-то подобное, кроме размещения в одном модуле?
Последний раз редактировалось Brainenjii 30.03.2012 10:24:24, всего редактировалось 1 раз.
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Дружественные классы

Сообщение Protopopulus » 16.03.2012 23:48:25

О! Сишники подтянулись...
Аватара пользователя
Protopopulus
новенький
 
Сообщения: 24
Зарегистрирован: 25.11.2010 09:58:07

Re: Дружественные классы

Сообщение Максим » 17.03.2012 00:40:55

Class helpers? Есть.
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Дружественные классы

Сообщение NTFS » 17.03.2012 09:58:04

Ничего такого нет. Скажу больше, в Паскале есть уникальная особенность - все классы, размещенные в одном модуле, имеют полный доступ к членам друг друга.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Дружественные классы

Сообщение Brainenjii » 17.03.2012 10:45:15

все классы, размещенные в одном модуле, имеют полный доступ к членам друг друга

Не совсем - есть Strict Private
Class helpers

Нет, это другое

И все-таки... Слышал, что теперь можно использовать точку в названиях юнитов, а Java'вская модель так же действует?
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Дружественные и приватные классы

Сообщение Brainenjii » 30.03.2012 10:24:42

Так же - есть ли возможность указать - является ли класс приватным?

Добавлено спустя 19 минут 57 секунд:
Если нет - ведутся ли такие обсуждения? java'вовская модель, вроде как, довольно удачна и не ломает существующее положение дел в паскале? Так что применение чего-то похожего (с тех пор как можно использовать точку в пути) не должно вызывать проблем обратной совместимости...
// уж очень не хочется постоянно вкладывать всё в один километровый модуль или упражнятся с инклудами...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Дружественные и приватные классы

Сообщение Kemet » 30.03.2012 13:05:06

Brainenjii а зачем это нужно?
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

Re: Дружественные и приватные классы

Сообщение Brainenjii » 30.03.2012 14:27:27

В первую очередь, для тестов. Проверять внутреннее состояние объектов.
Во вторую - меня всегда пугали километровые модули. Поэтому стараюсь дробить код на модули. И часто вынужден помещать в публичную секцию свойства, которые по смыслу должны быть видимы паре-тройке связаных классов. Выходом могло бы быть объединение их в один модуль, но этого-то и хочется избежать.
[offtopic]
Сейчас даже интересно стало - для текущего проекта использую около 156 моих модулей.
Из них, общих для всех проектов - 80 (из них 53 - сгенерированы из документации ExtJS и большая часть - меньше 200 строк).
Среди всех, больше 1000 строк - в 3 модуля (обёртка для работы с БД и 2 - для рисования web гуя (последнюю пару собираюсь переписывать)). Все три - общие модули для всех проектов.
Соответственно, 76 - принадлежат только текущему пректу. Из них 15 - это рисование гуя, и 61 - собственно логика программы.
Из этих 61 - 15 модулей - на модель, 15 - на контроллеры, 8 - всякая вспомогательная фигня, 23 - тесты
Всего модулей от 500 до 1000 - 10, от 100 до 500 - 83.
Всего в проекте на логику - 10445 строк, а на гуй и тесты - 2380 и 3813 соответственно (тестами основательно занялся недавно, пишу их только для нового кода и попавшихся ошибок. Раньше проверял работу логики маленькими тестовыми формами,так что можно их считать вместе).
[/offtopic]
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Дружественные и приватные классы

Сообщение Kemet » 30.03.2012 15:34:46

Как по мне, так пихать в ObjectPascal всё что валяется под ногами не есть гуд, он и так уже начинает превращаться в монструозное чудовище (((.
С другой стлороны, тесты это хорошо, но каким образом это поможет тестированию, можно пример привести? Если всё дело в том, что дружественные классы имеют доступ к членам класса, то можно использовать директивы, помещая данные в публичную или приватную секцию в зависимости от режима - тест или релиз, к примеру, я именно так и делаю, плюс дополнительные тестирующие методы, доступные только в режиме тест.
Со вторым сложнее, но, опять же к примеру, можно использовать паттерн Посетитель.
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

Re: Дружественные и приватные классы

Сообщение Brainenjii » 30.03.2012 15:49:20

Все подряд и не нужно. Но есть действительно приятные моменты в других языках, которые прекрасно вписываются в концепцию паскаля. И система пространства имён - одна из них (то что есть в паскале несколько топорно, не правда ли). Использовать директивы - это конечно хорошо, но 1. костыль, 2. тестируемый и исполняемый код, получается что различен. Что несколько противоречит концепции тестирования.
Посетитель - это как раз когда нужно предоставить доступ к инкапсулируемым членам тем классам, которые эти данные как бы видеть бы и не должны. Тут обратная ситуация - есть классы, которые должны иметь доступ к этим членам. Но не могут ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Дружественные и приватные классы

Сообщение stikriz » 30.03.2012 17:20:55

Пишем в можуле:

Код: Выделить всё
TMyHackClass = class(TMyFrendClass)


Потом в тексте:

Код: Выделить всё
var V: TMyFrendClass;
...

TMyHackClass(V).ProtectedProperty
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

Re: Дружественные и приватные классы

Сообщение Kemet » 30.03.2012 17:32:50

Как говаривал незабвенный Пал Палыч, если у вас что-то не фурычит, значит что-то в схеме ))
Предоставлять приватные члены класса посторонним это моветон.
Приватное должно быть приватным, публичное - общедоступным.
Для теста помещаем в модуль с классом тестовые процедуры или класс-тестер - они имеют полный доступ к классу) и обрамляем их условной компиляцией, чтоб в релиз не попали, таким образом сам класс неизменен, а доступ к нему имеется полный.
Brainenjii писал(а): Но не могут ^_^

Так через паттерны и смогут или в модуле с классом объявляем процедуры/функции или спец классы-прокси с класс процедуре/функшн (как раз дружественные ) :)) через которые и будет осуществляться доступ к закрытым членам требуемых классов - работы ненамного больше, зато в компилятор не лезем и не зависим от него.
А использовать в паскале обертки над чужеродным кодом, стараясь привести обертки к оригиналу и куроча при этом компилятор под эту узкую задачу мне кажется, неверный подход.
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru