Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2016.01.24;
Скачать: CL | DM;

Вниз

Как вам более понятно?   Найти похожие ветки 

 
Кто б сомневался ©   (2015-05-21 00:45) [40]

Первый, но измененный.

Я бы весь текст вынес в отдельную строку константу и использовал 1 вызов Format. В комментах указал бы что есть что.
Так еще удобней, т.к. возможно текст может измениться, или может быть переведен - его проще менять в будущем - напр. обычным юзерам, которые решили перевести помочь.

const MyString = "ID перевода: %s" +#13#10+ #13#10+  // aID
     "Номер перевода: %s"  +#13#10+                    // aTRN
     "Код точки: %s" +#13#10; итд   //aPP_CODE

sBody := Format(MyString, [aID, aTRN, aPP_CODE]);


Но если код очень часто вызывается, то второй.


 
Кто б сомневался ©   (2015-05-21 00:55) [41]


> его проще менять в будущем - напр. обычным юзерам


Если текст грузится с текстового файла.


 
sniknik ©   (2015-05-21 10:36) [42]

> Если текст грузится с текстового файла.
В [0] видно, что это код.
Если бы грузился юзерский файл, то, ИМХО, лучше подошёл бы вариант с парсером "аля PhP" предложенный выше, так чтобы переменные явно в текст записывались. Но вообще это офтопик. В обсуждении исключительно код + программист, и никаких юзеров.


 
Дмитрий Белькевич ©   (2015-05-21 11:41) [43]

+ за [40], типа такого что-то:


FormatStr :=
    "ID перевода: %s"    + CRLF + CRLF +
    "Номер перевода: %s" + CRLF +
    "Код точки: %s"      + CRLF +
    "Дата: %s"           + CRLF + CRLF +
    "Номер претензии: %s"+ CRLF +
    "Комментарий: %s"    + CRLF +
    "Имя клиента: %s"    + CRLF +
    "Телефон: %s"        + CRLF +
    "Почта: %s";
   
sBody := Format(FormatStr, [aID, aTRN, ...]);


Номер претензии обрабатывать отдельно, до или после присвоения FormatStr.


 
Дмитрий Белькевич ©   (2015-05-21 11:46) [44]

Или const вместо FormatStr, да. Ничего же не меняется. ИМХО - наилучший вариант, но - тебе решать, конечно. Если нужна максимальная производительность - лучше вообще и без конкатенации и формата делать - копированием в длинную строку, с указателем на текущую вершину, мне кажется. Но, понятно, наглядность и прозрачность сильно пострадают. Названия переменных, опять же - плохие.


 
sniknik ©   (2015-05-21 12:09) [45]

> но - тебе решать, конечно
?
Как? На что повлияет "решение"? (или решил, что я спрашиваю для себя, свой стиль переформировать?)

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

И обычно чужой код очень трудно понять... нелогичный, запутанный, будто специально куча усложнений.
Ну вот "твой"+[40] вариант, думаешь понятнее для чтения из-за "наведенного косметического сахара"?

Сталкивался. + То же самое у него, вот писал
> запросы вынесены в константы (+ поэтапное внесение... т.е. константу в переменную, а переменную после в CommandText)
Запрос в одном месте, использование в другом, а то и по разным модулям разнесено, параметры передаются через какие-то обезличенные наборы, и т.д.
Хотя, вроде бы просто, напиши прям там где используешь, и не нужно "мотаться" из модуля в модуль чтобы просто посмотреть как, и из чего сформируется запрос/письмо.

Вот сам прикинь, поставь себя на место читающего... в твоем случае. Вот тебе заявка "там с письмом что-то не то, данные не на месте вроде". Ну вот и проверь правильно ли у тебя соотносятся порядковые %s с какой нибудь переменной, не перепутан ли порядок... будет их 50, и что? Без переноса функции в тестовую прогу и задание явных значений (на месте проверить в 90% случаев нельзя/сложнее)  получится? Просто прочитав код, дашь гарантию?

Хотя, ладно, чего я вообще убеждать начал... просто + еще пара человек чей код я бы не хотел получить на проверку.


 
Дмитрий Белькевич ©   (2015-05-21 17:58) [46]

>Просто прочитав код, дашь гарантию?

В [0] такая задача (над-модульный рефакторинг + проверки "на вшивость") не ставилась, как я вижу и понимаю, всё читать и плотно вникать в чужие проблемы, извини, нет времени. Для того, что написано в [0] локального случая, мне кажется, нормальное решение.

Я так бы вообще не делал, а делал бы шаблоны в файлах с названиями полей + парсер + данные в базе, у себя есть несколько немного похожих мест. Мне кажется  - тянуть эту всю муть в код вообще не стоит, хотя, как я написал, дело твоё - ты задачу лучше знаешь и видишь.


 
virex(home) ©   (2015-05-24 08:10) [47]

свой формат с блекждеком
из стрингреплейс

[var1] и [var2] вместо %s в массиве параметров

а еще лучше: вместо массива искать свойство объекта из рантайма по имени

tmyobj = class
 var1:string;
 var2:string;
end;

myobj:=tmyobj.create...

myformat("text [var1] [var2]", myobj)

function myformat(s:string; obj:tobject)...
begin
 ... вытаскиваем из obj свойства и stringreplace  на их содержимое

вот такой аналог синтакс сахара из си шарпа


 
virex(home) ©   (2015-05-24 20:30) [48]

в D7 можно так:

//{$M+} - включает rtti для TObject
//TMyObj можно наследовать и от TComponent, тогда модификатор не нужен
{$M+}
type TMyObj = class
 private
   Fvar1,Fvar2:string;
 published
   property var1:string read Fvar1 write Fvar1;
   property var2:string read Fvar2 write Fvar2;
end;
{$M-}

function myformat(text:string; obj:TObject):string;
var
 i,propCount:integer;
 propInfo: PPropInfo;
 propType: PPTypeInfo;
 propList: PPropList;
begin
 result:=text;

 PropList := AllocMem(SizeOf(PropList^));
 try
   GetPropInfos(obj.ClassInfo, propList);

   propCount := GetPropList(obj.ClassInfo, propList);

   for i := 0 to propCount - 1 do
   begin
     propInfo := propList^[i];
     propType := propInfo^.PropType;

     case propType^.Kind of
       tkString, tkLString, tkWString:
         result:=StringReplace(result,"["+propInfo^.Name+"]",GetStrProp(obj, propInfo),[rfReplaceAll, rfIgnoreCase]);
     end;
   end;
 finally
   FreeMem(PropList);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var obj:TMyObj;
begin
 obj:=TMyObj.Create;
 obj.var1:="hello";
 obj.var2:="world";
 Memo1.Text:=myformat("text: [var1] [var2]",obj);
end;


в Delphi 2010 и выше можно подключить rtti (псевдокод):

function myformat(text:string; obj:TObject):string;
var ctx : TRttiContext;
   rt : TRttiType;
   prop : TRttiProperty;
   value : TValue;
begin
 result:=text;
 ctx := TRttiContext.Create();
 try
   rt := ctx.GetType(obj.ClassType);
   for prop in rt.GetProperties() do begin

     case prop.PropertyType.TypeKind of
       tkString, tkLString, tkWString, tkUString:
         result:=StringReplace(result,"["+propInfo^.Name+"]",GetStrProp(obj, propInfo),[rfReplaceAll, rfIgnoreCase]);
        else continue;
     end;
   end;

 finally
   ctx.Free();
 end;
end;


 
virex(home) ©   (2015-05-24 20:40) [49]


> virex(home) ©   (24.05.15 20:30) [48]

GetPropInfos тут лишнее конечно
и во втором варианте propInfo без ^


 
Игорь Шевченко ©   (2015-05-25 11:04) [50]

"Я нашел, как применить  здесь
нестирающиеся шины из полиструктурного  волокна  с  вырожденными  аминными
связями и  неполными  кислородными  группами.  Но  я  не  знаю  пока,  как
использовать регенерирующий реактор на субтепловых нейтронах. Миша, Мишок!
Как быть с реактором?"


 
virex(home) ©   (2015-05-25 18:43) [51]

думаю при 50+ переменных которые нужно вывести в удобочитаемый вид в качестве отчета, лучше напрячь rtti чем лепить конкатенацию на каждую переменную


 
virex(home) ©   (2015-05-25 18:55) [52]

А еще проще: сделать отдельный класс для отчетности
Добавлять переменную в виде пары ключ-значение

report.add("mail","office@mail.com")
report.add("call","8800-000-000")
...
report.print("почта: [mail], телефон: [call]")


 
mike-d ©   (2015-05-25 19:13) [53]

to Игорь Шевченко ©   (25.05.15 11:04) [50]
"Присмотревшись к  устройству,  я  без  труда  узнал велосипед."

:)



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

Текущий архив: 2016.01.24;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.008 c
15-1432556013
Jeer
2015-05-25 15:13
2016.01.24
Занятно:


15-1432141680
Pavia
2015-05-20 20:08
2016.01.24
Рассечение программы на модули.


15-1432380919
Pavelnk
2015-05-23 14:35
2016.01.24
RAD 2010 конфликтует с виндой


15-1432503004
Юрий
2015-05-25 00:30
2016.01.24
С днем рождения ! 25 мая 2015 понедельник


2-1404496296
Sakipiel
2014-07-04 21:51
2016.01.24
как закрыть окно?