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

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

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

Ответить
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

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

Сообщение Brainenjii »

Есть что-то подобное, кроме размещения в одном модуле?
Последний раз редактировалось Brainenjii 30.03.2012 10:24:24, всего редактировалось 1 раз.
Аватара пользователя
Protopopulus
новенький
Сообщения: 24
Зарегистрирован: 25.11.2010 08:58:07

Сообщение Protopopulus »

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

Сообщение Максим »

Class helpers? Есть.
NTFS
постоялец
Сообщения: 388
Зарегистрирован: 05.11.2007 13:57:50
Откуда: Краснодар
Контактная информация:

Сообщение NTFS »

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

Сообщение Brainenjii »

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

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

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

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

Сообщение Brainenjii »

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

Добавлено спустя 19 минут 57 секунд:
Если нет - ведутся ли такие обсуждения? java'вовская модель, вроде как, довольно удачна и не ломает существующее положение дел в паскале? Так что применение чего-то похожего (с тех пор как можно использовать точку в пути) не должно вызывать проблем обратной совместимости...
// уж очень не хочется постоянно вкладывать всё в один километровый модуль или упражнятся с инклудами...
Kemet
постоялец
Сообщения: 241
Зарегистрирован: 10.02.2010 18:28:32
Откуда: Временно оккупированная территория
Контактная информация:

Сообщение Kemet »

Brainenjii а зачем это нужно?
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

В первую очередь, для тестов. Проверять внутреннее состояние объектов.
Во вторую - меня всегда пугали километровые модули. Поэтому стараюсь дробить код на модули. И часто вынужден помещать в публичную секцию свойства, которые по смыслу должны быть видимы паре-тройке связаных классов. Выходом могло бы быть объединение их в один модуль, но этого-то и хочется избежать.
[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]
Kemet
постоялец
Сообщения: 241
Зарегистрирован: 10.02.2010 18:28:32
Откуда: Временно оккупированная территория
Контактная информация:

Сообщение Kemet »

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

Сообщение Brainenjii »

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

Сообщение stikriz »

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

Код: Выделить всё

TMyHackClass = class(TMyFrendClass)


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

Код: Выделить всё

var V: TMyFrendClass;
...

TMyHackClass(V).ProtectedProperty
Kemet
постоялец
Сообщения: 241
Зарегистрирован: 10.02.2010 18:28:32
Откуда: Временно оккупированная территория
Контактная информация:

Сообщение Kemet »

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

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