Дружественные и приватные классы
Модератор: Модераторы
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Дружественные и приватные классы
Есть что-то подобное, кроме размещения в одном модуле?
Последний раз редактировалось Brainenjii 30.03.2012 10:24:24, всего редактировалось 1 раз.
- Protopopulus
- новенький
- Сообщения: 24
- Зарегистрирован: 25.11.2010 08:58:07
О! Сишники подтянулись...
Class helpers? Есть.
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
все классы, размещенные в одном модуле, имеют полный доступ к членам друг друга
Не совсем - есть Strict Private
Class helpers
Нет, это другое
И все-таки... Слышал, что теперь можно использовать точку в названиях юнитов, а Java'вская модель так же действует?
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Так же - есть ли возможность указать - является ли класс приватным?
Добавлено спустя 19 минут 57 секунд:
Если нет - ведутся ли такие обсуждения? java'вовская модель, вроде как, довольно удачна и не ломает существующее положение дел в паскале? Так что применение чего-то похожего (с тех пор как можно использовать точку в пути) не должно вызывать проблем обратной совместимости...
// уж очень не хочется постоянно вкладывать всё в один километровый модуль или упражнятся с инклудами...
Добавлено спустя 19 минут 57 секунд:
Если нет - ведутся ли такие обсуждения? java'вовская модель, вроде как, довольно удачна и не ломает существующее положение дел в паскале? Так что применение чего-то похожего (с тех пор как можно использовать точку в пути) не должно вызывать проблем обратной совместимости...
// уж очень не хочется постоянно вкладывать всё в один километровый модуль или упражнятся с инклудами...
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
В первую очередь, для тестов. Проверять внутреннее состояние объектов.
Во вторую - меня всегда пугали километровые модули. Поэтому стараюсь дробить код на модули. И часто вынужден помещать в публичную секцию свойства, которые по смыслу должны быть видимы паре-тройке связаных классов. Выходом могло бы быть объединение их в один модуль, но этого-то и хочется избежать.
[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]
Во вторую - меня всегда пугали километровые модули. Поэтому стараюсь дробить код на модули. И часто вынужден помещать в публичную секцию свойства, которые по смыслу должны быть видимы паре-тройке связаных классов. Выходом могло бы быть объединение их в один модуль, но этого-то и хочется избежать.
[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
- Откуда: Временно оккупированная территория
- Контактная информация:
Как по мне, так пихать в ObjectPascal всё что валяется под ногами не есть гуд, он и так уже начинает превращаться в монструозное чудовище (((.
С другой стлороны, тесты это хорошо, но каким образом это поможет тестированию, можно пример привести? Если всё дело в том, что дружественные классы имеют доступ к членам класса, то можно использовать директивы, помещая данные в публичную или приватную секцию в зависимости от режима - тест или релиз, к примеру, я именно так и делаю, плюс дополнительные тестирующие методы, доступные только в режиме тест.
Со вторым сложнее, но, опять же к примеру, можно использовать паттерн Посетитель.
С другой стлороны, тесты это хорошо, но каким образом это поможет тестированию, можно пример привести? Если всё дело в том, что дружественные классы имеют доступ к членам класса, то можно использовать директивы, помещая данные в публичную или приватную секцию в зависимости от режима - тест или релиз, к примеру, я именно так и делаю, плюс дополнительные тестирующие методы, доступные только в режиме тест.
Со вторым сложнее, но, опять же к примеру, можно использовать паттерн Посетитель.
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Все подряд и не нужно. Но есть действительно приятные моменты в других языках, которые прекрасно вписываются в концепцию паскаля. И система пространства имён - одна из них (то что есть в паскале несколько топорно, не правда ли). Использовать директивы - это конечно хорошо, но 1. костыль, 2. тестируемый и исполняемый код, получается что различен. Что несколько противоречит концепции тестирования.
Посетитель - это как раз когда нужно предоставить доступ к инкапсулируемым членам тем классам, которые эти данные как бы видеть бы и не должны. Тут обратная ситуация - есть классы, которые должны иметь доступ к этим членам. Но не могут ^_^
Посетитель - это как раз когда нужно предоставить доступ к инкапсулируемым членам тем классам, которые эти данные как бы видеть бы и не должны. Тут обратная ситуация - есть классы, которые должны иметь доступ к этим членам. Но не могут ^_^
Пишем в можуле:
Потом в тексте:
Код: Выделить всё
TMyHackClass = class(TMyFrendClass)
Потом в тексте:
Код: Выделить всё
var V: TMyFrendClass;
...
TMyHackClass(V).ProtectedProperty
-
Kemet
- постоялец
- Сообщения: 241
- Зарегистрирован: 10.02.2010 18:28:32
- Откуда: Временно оккупированная территория
- Контактная информация:
Как говаривал незабвенный Пал Палыч, если у вас что-то не фурычит, значит что-то в схеме ))
Предоставлять приватные члены класса посторонним это моветон.
Приватное должно быть приватным, публичное - общедоступным.
Для теста помещаем в модуль с классом тестовые процедуры или класс-тестер - они имеют полный доступ к классу) и обрамляем их условной компиляцией, чтоб в релиз не попали, таким образом сам класс неизменен, а доступ к нему имеется полный.
Так через паттерны и смогут или в модуле с классом объявляем процедуры/функции или спец классы-прокси с класс процедуре/функшн (как раз дружественные )
) через которые и будет осуществляться доступ к закрытым членам требуемых классов - работы ненамного больше, зато в компилятор не лезем и не зависим от него.
А использовать в паскале обертки над чужеродным кодом, стараясь привести обертки к оригиналу и куроча при этом компилятор под эту узкую задачу мне кажется, неверный подход.
Предоставлять приватные члены класса посторонним это моветон.
Приватное должно быть приватным, публичное - общедоступным.
Для теста помещаем в модуль с классом тестовые процедуры или класс-тестер - они имеют полный доступ к классу) и обрамляем их условной компиляцией, чтоб в релиз не попали, таким образом сам класс неизменен, а доступ к нему имеется полный.
Brainenjii писал(а): Но не могут ^_^
Так через паттерны и смогут или в модуле с классом объявляем процедуры/функции или спец классы-прокси с класс процедуре/функшн (как раз дружественные )
А использовать в паскале обертки над чужеродным кодом, стараясь привести обертки к оригиналу и куроча при этом компилятор под эту узкую задачу мне кажется, неверный подход.
