Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Непонятки с реализацией неск. классов в одном модуле (число прочтений - 4492 )
alexqc
Junior Member
**
Отсутствует



Сообщений: 77
Местоположение: АР Крым, Симферополь
Зарегистрирован: 21. Июня 2006
Пол: Мужской
Непонятки с реализацией неск. классов в одном модуле
18. Ноября 2009 :: 09:58
Печать  
Попытался в одном модуле реализовать классы с частично-пересекающимся функционалом. Т.е. некоторые свойства/методы одинаковые, некоторые одинаковы по вызову но немного отличаются в реализации. Вобщем, в реализации изменяются только некоторые моменты. Выглядеть должно было примерно так:

Код
Выбрать все
//-------------------------------
Функция НекийМетод()
    Перем п1,п2,п3;
	//# ClassBegin Класс1;
	Я().МетодПредкаКласса1(п1,п2,п3);
	//# ClassEnd Класс1;

	//# ClassBegin Класс2;
	Я().МетодПредкаКласса2(123,456,п1,п2,п3);
	//# ClassEnd Класс2;

	Возврат обрботкаРезультатов(п1,п2,п3);

КонецФункции //НекийМетод
 



Но не сработало. В ходе танцев с бубном оказалось, что:
1. //# ClassBegin, //# ClassEnd - нужно писать именно таким образом, с пробелом!
2. Выражение из документации "Текст одного класса обязательно должен идти одним куском" следует понимать так, что код класса Класс1 идет только между ClassBegin и ClassEnd, при чем только между первыми. Я по наивности думал, что "один кусок" означает недопустимость конструкции

Код
Выбрать все
//# ClassBegin Класс1;
...
//# ClassBegin Класс2;
...
//# ClassEnd Класс2;
...
//# ClassEnd Класс1;

 


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

Правильно ли я все понял?

ИМХО, в таком виде реализация неудобна. Удобнее было бы сделать это как-то так:
поскольку в выражениях //#if, //#elif допустимы не только условия определенности/неопределенности символа, но и сравнения, можно добавить символ classname, автоматом получающий имя компилируемого класса. Тогда определение множества классов в одном модуле реализуется вполне логично
Код
Выбрать все
//#if classname = "Класс1"
...
//#elif classname = "Класс2"
...
и т.п.
 



P.S.
Кстати, я счас примерно так и сделал

Код
Выбрать все
	Если типЗначенияСтр(Я())="Класс1" Тогда
	Я().МетодПредкаКласса1(п1,п2,п3);

	ИначеЕсли типЗначенияСтр(Я())="Класс2" Тогда
	Я().МетодПредкаКласса2(123,456,п1,п2,п3);
	КонецЕсли

 



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

Везде - от моря Черного до снежной Колымы - мы трудностям показываем кукиш.
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Непонятки с реализацией неск. классов в одном модуле
Ответ #1 - 18. Ноября 2009 :: 11:03
Печать  
Такова реализация Улыбка
Ее особенности описаны в документации.
Пока кто-нибудь не исправит, будем жить с подобной реализацией.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
alexqc
Junior Member
**
Отсутствует



Сообщений: 77
Местоположение: АР Крым, Симферополь
Зарегистрирован: 21. Июня 2006
Пол: Мужской
Re: Непонятки с реализацией неск. классов в одном модуле
Ответ #2 - 18. Ноября 2009 :: 14:14
Печать  
Скачал исходники, к сожалению компилировать не могу.

Но есть пара вопросов Улыбка.

1. если я правильно понял, препроцессор счас работает только на факт определения символа. Значения никакого у символа нет?
2. Все операции сравнения соответственно тоже только сравнивают факт определения символа. Т.е. //#if sym1=sym2 означает что оба sym1 и sym2 одновременно определены либо оба неопределены, а не сравнение их значений.

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

3. Посмотрев реализацию дефайна и парсера выражений в #if, я пришел к выводу, что символ препроцессора может включать не только обычные для идентификаторов буквенно-цифровые символы, но и иные - все кроме скобок и операторов. Т.е. можно, например, задефайнить такое: ааа:ббб+ввв.

4. Соответственно, моя идея об //#if classname="класс1" в свете всего вышесказанного - несостоятельна.
Однако, в таком случае можно сделать иное: при компиляции сформировать символ, состоящий из имени класса (с, возможно, неким префиксом), и потом тестировать на него.

Вот добавление в реализацию CComponentClass::FirstInit, которое должно реализовать эту функциональность. Как префикс выбран символ @. Проверить не могу Печаль

Код
Выбрать все
{CString tClassName="@";
tClassName=tClassName+m_NameOfInstance;
pHierarchy->m_SymbolOfPreprocessor[className]=NULL;
try
	  {
		CPreprocessor::Preprocess(true, ModuleString, pHierarchy->m_SymbolOfPreprocessor, CMapStringToString(), FullFileName);
	  }
	  catch (CPreprocessor::ExeptionPreprocessor &ex)
	  {
		::ShowMsg("В модуле класса: %s (%s)", mmBlackErr, m_NameOfInstance, FullFileName);
		::ShowMsg(ex.GetErrorString(), mmBlackErr);

		if (!ex.GetCodeString().IsEmpty())
		{
			::ShowMsg("(%d) %s", mmBlackErr, ex.GetNumString(), ex.GetCodeString());
		}
		pHierarchy->m_SymbolOfPreprocessor.RemoveKey("_NOW_PREPARE_CLASS");
		pHierarchy->m_SymbolOfPreprocessor.RemoveKey(tClassName);
		return NULL;
	  }
	pHierarchy->m_SymbolOfPreprocessor.RemoveKey(tClassName);
}
 

  

Везде - от моря Черного до снежной Колымы - мы трудностям показываем кукиш.
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Непонятки с реализацией неск. классов в одном модуле
Ответ #3 - 18. Ноября 2009 :: 14:55
Печать  
Возможность хранения кода нескольких классов в одной обработке была добавлена мной из-за жгучего желания уменьшить количество обработок. Чтобы для класса на три строчки не надо было добавлять обработку.

Соответственно, и реализация была сделана именно такой.

Мне кажется, что то, что тебе нужно - называется функциональный стиль програмирования. Но его в 1С++ нет.
Некоторое подобие желаемого может дать еще полиморфизм. Который в 1С++ есть.
  
Наверх
www  
IP записан
 
alexqc
Junior Member
**
Отсутствует



Сообщений: 77
Местоположение: АР Крым, Симферополь
Зарегистрирован: 21. Июня 2006
Пол: Мужской
Re: Непонятки с реализацией неск. классов в одном модуле
Ответ #4 - 18. Ноября 2009 :: 15:54
Печать  
Нет, это не функциональное программирование. Это действительно полиморфизм, точнее наоборот, попытка его обеспечения. Я пытаюсь унифицировать работу с некоторыми типами, привести таксказать к общему интерфейсу. Фишка в том, что некоторые методы у предков различаются (изменять/дополнять реализацию предков я не могу, к тому же туда и встроенные 1Совские типы входят). Конечно, в традициях полиморфизма надо на каждого зверя свою обертку сделать, а классы с обобщенными алгоритмами (которые реализуются одним модулем) наследовать от оберток, но блин это ж и лишняя иерархия, и лишние обработки.
  

Везде - от моря Черного до снежной Колымы - мы трудностям показываем кукиш.
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Непонятки с реализацией неск. классов в одном модуле
Ответ #5 - 19. Ноября 2009 :: 10:43
Печать  
alexqc писал(а) 18. Ноября 2009 :: 15:54:
но блин это ж и лишняя иерархия, и лишние обработки.

Так вот именно чтобы можно было хранить несколько классов-оберток в одной обработке - и была добавлена эта возможность Улыбка
  
Наверх
www  
IP записан
 
alexqc
Junior Member
**
Отсутствует



Сообщений: 77
Местоположение: АР Крым, Симферополь
Зарегистрирован: 21. Июня 2006
Пол: Мужской
Re: Непонятки с реализацией неск. классов в одном модуле
Ответ #6 - 19. Ноября 2009 :: 11:48
Печать  
В принципе конечно вариант.
Жалко только, что в таком виде (а тут явно будут ф-ции с одинаковыми названиями) оно точно синтакс-контроль не пройдет  Печаль.

И лишняя иерархия остается. Вот если б можно было наряду с множественным наследованием некую "многомодульность реализации" использовать  Очень довольный. Кстати, #include в модулях не действуют? Только в defcls?
  

Везде - от моря Черного до снежной Колымы - мы трудностям показываем кукиш.
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Непонятки с реализацией неск. классов в одном модуле
Ответ #7 - 19. Ноября 2009 :: 12:04
Печать  
alexqc писал(а) 19. Ноября 2009 :: 11:48:
Жалко только, что в таком виде (а тут явно будут ф-ции с одинаковыми названиями) оно точно синтакс-контроль не пройдет  Печаль.

Кто тебе сказал? Улыбка
  
Наверх
www  
IP записан
 
alexqc
Junior Member
**
Отсутствует



Сообщений: 77
Местоположение: АР Крым, Симферополь
Зарегистрирован: 21. Июня 2006
Пол: Мужской
Re: Непонятки с реализацией неск. классов в одном модуле
Ответ #8 - 19. Ноября 2009 :: 12:53
Печать  
А почему пройдет? На всяк случай уточню - я имею ввиду конфигуратор. То что оно в предприятии загрузится как надо - это понятно.
А так: фактически в модуле 2 ф-ции с одинаковым именем, конфигуратор ничего про препроцессор не знает, соответственно и ругается "Процедура или функция с указанным именем уже определена в текущем модуле" (тока что проверил). Может конечно я от жизни отстал, и последние vis1cpp или подобные плугины к опенконфу позволяют проверять синтаксис и в таких случаях (у меня vis1cpp 1.0.0.7)?

  

Везде - от моря Черного до снежной Колымы - мы трудностям показываем кукиш.
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Непонятки с реализацией неск. классов в одном модуле
Ответ #9 - 19. Ноября 2009 :: 13:26
Печать  
alexqc писал(а) 19. Ноября 2009 :: 12:53:
Может конечно я от жизни отстал, и последние vis1cpp или подобные плугины к опенконфу позволяют проверять синтаксис и в таких случаях (у меня vis1cpp 1.0.0.7)?

Именно. 1.0.0.13.
  
Наверх
www  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Непонятки с реализацией неск. классов в одном модуле
Ответ #10 - 29. Ноября 2009 :: 15:53
Печать  
Хвастаться конечно не хорошо, но все же...
Вот у меня в 1Class нет таких подпорок как ClassBegin/ClassEnd.
У меня просто перед обработкой препроцессором текста модуля класса, движком сразу взводятся символы getclass и getclass_ИмяКласса, а дальше все рулится с помощью //@if, например

Код
Выбрать все
Процедура Трям()
//@if getclass_ПервыйКласс
    Сообщить("Трям");
//@elif getclass_Второй | getclass_Sample
    Сообщить("Трям-пам");
//@elif !getclass
    Сообщить("Обработка");
//@else
    Сообщить("Пам-трям");
//@endif 



Почему бы и в 1С++ так не сделать?
  
Наверх
 
IP записан
 
alexqc
Junior Member
**
Отсутствует



Сообщений: 77
Местоположение: АР Крым, Симферополь
Зарегистрирован: 21. Июня 2006
Пол: Мужской
Re: Непонятки с реализацией неск. классов в одном модуле
Ответ #11 - 23. Декабря 2009 :: 09:29
Печать  
> Почему бы и в 1С++ так не сделать?

Странный вопрос. Читаю прямо слева
orefkov
1c++ developer
Подмигивание

Так и кому карты в руки?
  

Везде - от моря Черного до снежной Колымы - мы трудностям показываем кукиш.
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать