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

Вниз

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

 
Кто б сомневался ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.003 c
15-1432141680
Pavia
2015-05-20 20:08
2016.01.24
Рассечение программы на модули.


15-1432364202
Владимир Кладов
2015-05-23 09:56
2016.01.24
Астрономия


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


15-1410853148
Kerk
2014-09-16 11:39
2016.01.24
DelphiAST - каждому по автошеме


15-1432556013
Jeer
2015-05-25 15:13
2016.01.24
Занятно:





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский