Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];

Вниз

Положительные или отрицательные стороны оператора With   Найти похожие ветки 

 
Riply ©   (2007-02-24 01:42) [0]

Здравствуйте !
Какую из нижепреведенных функций лучше использовать и почему ?
Или они (после компиляции) - одно и тоже?
type
PMyRec = ^TMyRec;
TMyRec = record
 Param1: integer;
 Param2: integer;
 Param3: integer;
end;

function SumDirect(pRec: PMyRec): integer;
begin
Result := pRec.Param1 + pRec.Param2 + pRec.Param3;
end;

function SumWith(pRec: PMyRec): integer;
begin
with pRec^ do
 Result := Param1 + Param2 + Param3;
end;


 
Германн ©   (2007-02-24 01:56) [1]


> Riply ©   (24.02.07 01:42)
>
> Здравствуйте !
> Какую из нижепреведенных функций лучше использовать и почему
> ?
> Или они (после компиляции) - одно и тоже?

После компилляции они одно и тоже. Поэтому лучше использовать вторую. Меньше износ подушечек пальцев :)

А по серьёзному если. Использование оператора with очень часто оправдано. Но при этом, порой, нужно чётко представлять себе, что некие имена в данном участке кода могут относиться к разным переменным и чётко понимать правила, по которым компиллятор определяет эти отношения!


 
Германн ©   (2007-02-24 02:03) [2]

Нажал "Добавить" не "додумав" :(
Добавлю. Использование оператора with оправдано только если использующий его точно знает что он хочет! Тогда он вправе его использовать для экономии времени и "сохранности пальцев и кнопок на клавиатуре"!


 
Riply ©   (2007-02-24 02:03) [3]

>[1] Германн ©   (24.02.07 01:56)
Спасибо.
А внешне кажется, что в первом случае мы три раза
"перемещаемся" по указателю pRec, чтобы посмотреть "а что там за параметры" :)


 
Riply ©   (2007-02-24 02:05) [4]

> [2] Германн ©   (24.02.07 02:03)
>Использование оператора with оправдано только если использующий его точно знает что он хочет!
"использующий" хочет оптимизировать код :)


 
Германн ©   (2007-02-24 02:09) [5]


> Riply ©   (24.02.07 02:03) [3]
>
> >[1] Германн ©   (24.02.07 01:56)
> Спасибо.
> А внешне кажется, что в первом случае мы три раза
> "перемещаемся" по указателю pRec, чтобы посмотреть "а что
> там за параметры" :)

Неправильно у тебя настроено свойство "кажется" :)
Компиллятор и в первом и во втором случае вычисляет три адреса, причём одинаково. И подставляет вычисленные адреса в код программы.


 
Kostafey ©   (2007-02-24 02:16) [6]

Занятно, у нас когда я в технаре учился...а было это...в 2000г старый баян был.
В итоге преподы настоятельно рекомендовали не использовать конструкцию with.

Правда тогда про Delphi я знал только то что она есть (писали в основном Turbo C++/Pascal).
Сегодня сию рекомендацию я не принимаю более всерьез.


> чётко понимать правила, по которым компиллятор определяет
> эти отношения!

А что за правила ?


 
Германн ©   (2007-02-24 02:34) [7]


> Kostafey ©   (24.02.07 02:16) [6]
>
> Занятно, у нас когда я в технаре учился...а было это...в
> 2000г старый баян был.
> В итоге преподы настоятельно рекомендовали не использовать
> конструкцию with.
...
> А что за правила ?
>

Правильно рекомендовали. Оператор with нужен только автору кода для "некоего упрощения жизни". Но если автор только учится, то он скорее всего "огребёт по полной когда-нибудь", если до этого не поймёт сути!


 
Германн ©   (2007-02-24 02:39) [8]


> Riply ©   (24.02.07 02:05) [4]
>
...
> "использующий" хочет оптимизировать код :)
>

Никакой оптимизации он тут не получит, забудь и не вспоминай :)


 
Amoeba ©   (2007-02-26 14:46) [9]

Здесь обсуждался данный вопрос:
http://www.delphikingdom.com/asp/talktopic.asp?ID=327


 
clickmaker ©   (2007-02-26 14:50) [10]


> Riply ©   (24.02.07 01:42)

все хорошо в меру, как сказал Неру


 
Игорь Шевченко ©   (2007-02-26 14:52) [11]

В ряде случаев использование оператора With ведет к дополнительной оптимизации кода.

A with statement is a shorthand for referencing the fields of a record or the fields, properties, and methods of an object. The syntax of a with statement is

with obj do statement, or
with obj1, ..., objn do statement
where obj is an expression yielding a reference to a record, object instance, class instance, interface or class type (metaclass) instance, and statement is any simple or structured statement. Within the statement, you can refer to fields, properties, and methods of obj using their identifiers alone, that is, without qualifiers.

For example, given the declarations
type
 TDate = record
   Day: Integer;
   Month: Integer;
   Year: Integer;
 end;

var
 OrderDate: TDate;
you could write the following with statement.
with OrderDate do
if Month = 12 then
  begin
    Month := 1;
    Year := Year + 1;
  end
else
  Month := Month + 1;
you could write the following with statement.
if OrderDate.Month = 12 then
 begin
  OrderDate.Month := 1;
  OrderDate.Year := OrderDate.Year + 1;
 end
else
 OrderDate.Month := OrderDate.Month + 1;
If the interpretation of obj involves indexing arrays or dereferencing pointers, these actions are performed once, before statement is executed. This makes with statements efficient as well as concise. It also means that assignments to a variable within statement cannot affect the interpretation of obj during the current execution of the with statement.

Each variable reference or method name in a with statement is interpreted, if possible, as a member of the specified object or record. If there is another variable or method of the same name that you want to access from the with statement, you need to prepend it with a qualifier, as in the following example.
with OrderDate do
 begin
   Year := Unit1.Year;
      ...
 end;
When multiple objects or records appear after with, the entire statement is treated like a series of nested with statements. Thus

with obj1, obj2, ..., objn do statement
is equivalent to
with obj1 do
 with obj2 do
   ...
   with objn do
     // statement
In this case, each variable reference or method name in statement is interpreted, if possible, as a member of objn; otherwise it is interpreted, if possible, as a member of objn1; and so forth. The same rule applies to interpreting the objs themselves, so that, for instance, if objn is a member of both obj1 and obj2, it is interpreted as obj2.objn.

(с) F1


 
Аноним   (2007-02-26 17:16) [12]

Разбирался как то в чужом коде
там было написано
with objeсt1, objeсt2...., objeсt7 do

то есть 7 разных сущностей.
...
Чужой код. Где чье... ctrl+click в IDE работать отказался на таком чуде...
хотелось взять что-нить тяжелое и по голове приложить автору.

Есть еще такая фича - эти самые with очень плохо отлаживаются, хинт не работает при остановке, Ctrl+F7 не кажет по умолчанию что должно.
Короче я для себя решил with"ами особо не пользоваться


 
Игорь Шевченко ©   (2007-02-26 17:31) [13]

Аноним   (26.02.07 17:16) [12]

Всякий овощ приносит пользу, будучи употреблен надлежащим образом в надлежащее время (с)


 
Riply ©   (2007-02-27 05:55) [14]

> [11] Игорь Шевченко ©   (26.02.07 14:52)
Спасибо !
P.S.
Значит, у меня, не так уж и плохо "настроено свойство кажется" :)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.039 c
15-1172172498
@!!ex
2007-02-22 22:28
2007.03.18
Звездные войны


6-1159627784
S K i N E R
2006-09-30 18:49
2007.03.18
Как узнать когда завешина передача файла через NMStrm?


15-1172077975
Илья84
2007-02-21 20:12
2007.03.18
Перенос Delphi на другой ПК


15-1171867558
Pazitron_Brain
2007-02-19 09:45
2007.03.18
Старая мать + новый винт


9-1145623480
KiberKot
2006-04-21 16:44
2007.03.18
Анимация





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский