Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Торможу. Как избавиться от дублирования? (число прочтений - 2714 )
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Торможу. Как избавиться от дублирования?
20. Октября 2006 :: 16:15
Печать  
Код класса. Хочу устранить дублирование в коде методов СуммаПоставки и НДСПоставки.

Код
Выбрать все
Перем _СуммаПоставки;
Перем _НДСПоставки;

Функция Сам(Конт)
	Возврат Конт;
КонецФункции

Процедура Конструктор()
	_СуммаПоставки = 0;
	_НДСПоставки = 0;
КонецПроцедуры

Процедура ЗаполнитьРеквизиты()
	Сам(Контекст).ДокументОснование.ВыбратьСтроки();
	Пока Сам(Контекст).ДокументОснование.ПолучитьСтроку() = 1 Цикл
		Если Сам(Контекст).ДокументОснование.ОС = Сам(Контекст).ОС Тогда
			_СуммаПоставки = Сам(Контекст).ДокументОснование.Всего;
			_НДСПоставки = Сам(Контекст).ДокументОснование.НДС;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Функция СуммаПоставки() Экспорт

	Если _СуммаПоставки <> 0 Тогда
		Возврат _СуммаПоставки;
	КонецЕсли;

	Если Сам(Контекст).ДокументОснование.Вид() <> "ПоступлениеОС" Тогда
		Возврат Сам(Контекст).ПолучитьБазовыйКласс("Документы_КнигиПокупок").СуммаПоставки();
	КонецЕсли;

	ЗаполнитьРеквизиты();

	Если _СуммаПоставки = 0 Тогда
		Сообщить("В документе поступления не найдено ОС "+Сам(Контекст).ОС+", принимаемое к учету.", "!");
	КонецЕсли;
	Возврат _СуммаПоставки;

КонецФункции

Функция НДСПоставки() Экспорт
	Если _НДСПоставки <> 0 Тогда
		Возврат _НДСПоставки;
	КонецЕсли;

	Если Сам(Контекст).ДокументОснование.Вид() <> "ПоступлениеОС" Тогда
		Возврат Сам(Контекст).ПолучитьБазовыйКласс("Документы_КнигиПокупок").НДСПоставки();
	КонецЕсли;

	ЗаполнитьРеквизиты();

	Если _НДСПоставки = 0 Тогда
		Сообщить("В документе поступления не найдено ОС "+Сам(Контекст).ОС+", принимаемое к учету.", "!");
	КонецЕсли;
	Возврат _НДСПоставки;

КонецФункции
 

  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Торможу. Как избавиться от дублирования?
Ответ #1 - 20. Октября 2006 :: 16:42
Печать  
Добавка: настойчиво хочется передать имена методов базового класса ("СуммаПоставки()" и "НДСПоставки()") как текстовые параметры, чтобы рассчитывать их только по условию.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Торможу. Как избавиться от дублирования?
Ответ #2 - 20. Октября 2006 :: 18:05
Печать  
fez

По поводу дублирования что-то не знаю.
Может, нужно добавить в 1cpp методы по простому доступу к переменным и методам по имени?
Это вроде было в FormEx, но я не пользовался, у меня в свое время не пошло.

Или можно вызовы функций через делегат сделать.
Тогда с доступом к атрибутам что-то нужно придумать.

Или через выполняемый модуль можно.
Только не помню, как сейчас с обработкой исключений обстоит дело.

А вот это
Код
Выбрать все
Процедура ЗаполнитьРеквизиты()
	Сам(Контекст).ДокументОснование.ВыбратьСтроки();
	Пока Сам(Контекст).ДокументОснование.ПолучитьСтроку() = 1 Цикл
		Если Сам(Контекст).ДокументОснование.ОС = Сам(Контекст).ОС Тогда
			_СуммаПоставки = Сам(Контекст).ДокументОснование.Всего;
			_НДСПоставки = Сам(Контекст).ДокументОснование.НДС;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
 


мне не нравится - я бы переписал через ит (конечно, если там может быть больше трех строчек).
  

De quelle planète es-tu?
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Торможу. Как избавиться от дублирования?
Ответ #3 - 20. Октября 2006 :: 20:27
Печать  
Ну я бы для начала отрефакторил метод ЗаполнитьРеквизиты()
Код
Выбрать все
Процедура ЗаполнитьРеквизиты()
	докОснование = Сам(Контекст).ДокументОснование;
	ОС = Сам(Контекст).ОС;
	докОснование.ВыбратьСтроки();
	Пока докОснование.ПолучитьСтроку() = 1 Цикл
		Если докОснование.ОС <> ОС Тогда Продолжить; КонецЕсли;
		_СуммаПоставки = Сам(Контекст).ДокументОснование.Всего;
		_НДСПоставки = Сам(Контекст).ДокументОснование.НДС;
	КонецЦикла;
КонецПроцедуры 


Потом убрал бы еще один неприятный запах, сделал один из следующих вариантов (хотя, возможно, приведенный вариант правильный).
Код
Выбрать все
		_СуммаПоставки = Сам(Контекст).ДокументОснование.Всего;
		_НДСПоставки = Сам(Контекст).ДокументОснование.НДС;
		Прервать; 


либо
Код
Выбрать все
		_СуммаПоставки = _СуммаПоставки + Сам(Контекст).ДокументОснование.Всего;
		_НДСПоставки = _НДСПоставки + Сам(Контекст).ДокументОснование.НДС; 


Затем перенес бы еще один кусок:
Код
Выбрать все
Процедура ЗаполнитьРеквизиты()
	докОснование = Сам(Контекст).ДокументОснование;
	ОС = Сам(Контекст).ОС;

	Если докОснование .Вид() <> "ПоступлениеОС" Тогда
		База = Сам(Контекст).ПолучитьБазовыйКласс("Документы_КнигиПокупок");
		_СуммаПоставки = База.СуммаПоставки();
		_НДСПоставки = База.НДСПоставки();
		Возврат;
	КонецЕсли;

	докОснование.ВыбратьСтроки();
	Пока докОснование.ПолучитьСтроку() = 1 Цикл
		Если докОснование.ОС <> ОС Тогда Продолжить; КонецЕсли;
		_СуммаПоставки = Сам(Контекст).ДокументОснование.Всего;
		_НДСПоставки = Сам(Контекст).ДокументОснование.НДС;
		Прервать;
	КонецЦикла;
КонецПроцедуры 


Потом бы отметил, что сообщение одно и то же. Скорее всего, его можно генерировать по одному условию:
Код
Выбрать все
Процедура ЗаполнитьРеквизиты()
	докОснование = Сам(Контекст).ДокументОснование;
	ОС = Сам(Контекст).ОС;

	Если докОснование .Вид() <> "ПоступлениеОС" Тогда
		База = Сам(Контекст).ПолучитьБазовыйКласс("Документы_КнигиПокупок");
		_СуммаПоставки = База.СуммаПоставки();
		_НДСПоставки = База.НДСПоставки();
		Возврат;
	КонецЕсли;

	докОснование.ВыбратьСтроки();
	Пока докОснование.ПолучитьСтроку() = 1 Цикл
		Если докОснование.ОС <> ОС Тогда Продолжить; КонецЕсли;
		_СуммаПоставки = Сам(Контекст).ДокументОснование.Всего;
		_НДСПоставки = Сам(Контекст).ДокументОснование.НДС;
		Прервать;
	КонецЦикла;

	Если _СуммаПоставки = 0 Тогда
		Сообщить("В документе поступления не найдено ОС "+Сам(Контекст).ОС+", принимаемое к учету.", "!");
	КонецЕсли;
КонецПроцедуры 


Либо заменить условие на какое-то, связанное с циклом.

Ну и что же у нас осталось от функций?
Код
Выбрать все
Функция СуммаПоставки() Экспорт
	Если _СуммаПоставки = 0 Тогда
		ЗаполнитьРеквизиты();
	КонецЕсли;

	Возврат _СуммаПоставки;
КонецФункции

Функция НДСПоставки() Экспорт
	Если _НДСПоставки = 0 Тогда
		ЗаполнитьРеквизиты();
	КонецЕсли;

	Возврат _НДСПоставки;
КонецФункции 



Ну что, будем дальше устранять дублирование? Тогда  вместо функций лучше использовать свойства(хотя можно было их использовать и раньше) и управлять считыванием свойств через _ПриЧтенииСвойства
(стрИмяАтрибута)
. Но тогда понадобится реализовать обращение к переменным по имени.
  
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Торможу. Как избавиться от дублирования?
Ответ #4 - 21. Октября 2006 :: 07:20
Печать  
Да, кстати, еще один неприятный запах - вывод сообщения в том же месте, где обрабатываются данные. Надо бы, чтобы мухи - отдельно, котлеты - отдельно.

Похоже, что эти функции - служебные. Поэтому в дальнейшем при их разнообразном использовании это Сообщить("...") начнет мешать.

Но, не зная способов использования данных функций, сложно продложить способ их разделения.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать