Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему так не любят Delphi? 
:(
    Опции темы
kolesnle
Дата 11.4.2013, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 22.3.2013

Репутация: нет
Всего: нет



Цитата(Zloxa @  11.4.2013,  15:15 Найти цитируемый пост)
Ты так и не понял абсрудрности своей логики. 

У дельфистов какая-то абсурдная логика 
PM MAIL   Вверх
Beltar
Дата 11.4.2013, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



Цитата

Жду легкий и непринужденный код на Паскале.


Ну легкого у меня не будет, обычно наоборот такие функции весьма сложные:

Код

function TfmReports.Report11: Integer;
var i,Row,Ovr,OvrGr,OvrDiv,CountGr,CountDiv,WT:Integer;
    Range,Mas:OleVariant;
    Last:Integer;
    S,S1,GName,DivName:String;
    D1,D2:TDateTime;
    OutFS:TFormatSettings;
    NeedRenderGrHead,NeedRenderDivHead:Boolean;

{Вот оно в чем фишка-то. В Паскале весь контекст гарантировано до объявления вложенного метода описан.}

procedure RenderTotal(Name:String; var Count,Minutes:Integer);
begin
Inc(Row);
S:=IntToStr(Row);
Range:=EWSheet.Range['A'+S,'D'+S];
Range.Merge;
Range:=EWSheet.Range['E'+S,'I'+S];
Range.Merge;
Range:=EWSheet.Range['A'+S,'I'+S];
Range.Font.FontStyle:='Bold';
if Name<>'' then Mas[0]:='Итого по '+Name+': '+IntToStr(Count)+' заявок'
            else Mas[0]:='Итого: '+IntToStr(Count)+' заявок';
Mas[4]:='Суммарное время: '+MinutesToHrsMinStr(Minutes);
Mas[5]:='';
Mas[6]:='';
Mas[7]:='';
Range.Value:=Mas;
Count:=0;
Minutes:=0;
end;

procedure RenderHead(var Name:String; const Field:String);
begin
Inc(Row);
S:=IntToStr(Row);
Range:=EWSheet.Range['A'+S,'H'+S];
Range.Merge;
Range.HorizontalAlignment:=xlCenter;
Range.Font.FontStyle:='Bold';
Name:=QRep.FieldByName(Field).AsString;
Mas[0]:=Name;
Range.Value:=Mas;
end;

begin
{//100500 строк создания строки S}

QRep.Active:=false;
QRep.SQL.Clear;
QRep.SQL.Add(S);

QRep.Active:=true;
{Еще много строк пропущено}
for i:=0 to Last do
  begin

  if GName<>QRep.FieldByName('GName').AsString then
    begin
    NeedRenderGrHead:=True;
    if i>0 then RenderTotal(GName,CountGr,OvrGr);
    end;
  if DivName<>QRep.FieldByName('DivName').AsString then
    begin
    NeedRenderDivHead:=True;
    if i>0 then RenderTotal(DivName,CountDiv,OvrDiv);
    end;
  if NeedRenderDivHead then RenderHead(DivName,'DivName');
  NeedRenderDivHead:=False;
  if NeedRenderGrHead then RenderHead(GName,'GName');
  NeedRenderGrHead:=False;
{ля-ля-ля, еще 100500 строк}
  QRep.Next;
  end;
RenderTotal(GName,CountGr,OvrGr);
RenderTotal(DivName,CountDiv,OvrDiv);
Last:=QRep.RecordCount;
RenderTotal('',Last,Ovr);

{Пропущено еще 100500 строк}
EA.Visible[lcid]:=true;

end;


Считаем количество вызовов вложенных процедурок и сэкономленных строк.

Это сообщение отредактировал(а) Beltar - 11.4.2013, 17:34


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
diadiavova
Дата 11.4.2013, 19:58 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 4
Всего: 142



Zloxa
k0rvin
вашу дискуссию о проблемах логики я нашел чрезвычайно занимательной и познавательной. С нетерпением жду ее продолжения и доведения до логического завершения. smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
k0rvin
Дата 11.4.2013, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(Beltar @  11.4.2013,  17:34 Найти цитируемый пост)
Ну легкого у меня не будет

Ну собственно... Попробую по-другому: каким образом этот код показывает костыльность замыканий?


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Beltar
Дата 11.4.2013, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



Ну давай то же самое через замыкания. Или пример попроще придумать?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
k0rvin
Дата 11.4.2013, 20:51 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(Beltar @ 11.4.2013,  20:33)
Или пример попроще придумать?

Конечно, мне как-то неуперлось с этой простыней разбираться. =)


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
k0rvin
Дата 11.4.2013, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Код

for item in collection do
  if item > 0 then
    item := item + 1;
end;


теперь с анонимными функциями без замыканий:
Код

collection.filter(x => x > 0).each(x => x + 1);


теперь с замыканиями:
Код

collection.filter(> 0).each(+ 1);


то же с вложенными подпрограммами (обозначения типов опущены для большего подобия):
Код

function positive(x) begin Result := x > 0 end;
function add1(x) begin Result := x + 1 end;
collection.filter(positive).each(add1);


Это сообщение отредактировал(а) k0rvin - 11.4.2013, 21:36


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Akella
Дата 11.4.2013, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Цитата(LSD @ 11.4.2013,  17:24)
Цитата(Akella @  11.4.2013,  13:30 Найти цитируемый пост)
И В Яндексе тоже пользуются дельфями.

Спросил знакомого из Яндекса - говорит брехня.

Ну так вакансия-то старая, щас может уже не ищут.

Добавлено через 1 минуту и 55 секунд
Цитата
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

PM MAIL   Вверх
Akella
Дата 11.4.2013, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



PM MAIL   Вверх
Beltar
Дата 11.4.2013, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



2 k0rvin:

И где тут вложенные подрограммы? Функции фильтрации действия с объектом тут внешние и в общем-то могут быть любые.

Кстати, проще всего в реализации по-моему вот-так:

Код

collection.each(positive,add1); Элементарно кодится.



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
k0rvin
Дата 12.4.2013, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(Beltar @  11.4.2013,  23:45 Найти цитируемый пост)
Кстати, проще всего в реализации по-моему вот-так:

Это не гибко и нарушает принцип single responsibility или как там его.
Ну и создавать на каждый чих add<n> как-то не удобно.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Beltar
Дата 12.4.2013, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



Твой вариант означает сразу формирование еще одного экземпляра списка, т. е. его надо создать, а потом еще копировать данные, возможный подход, но не в 100% случаев. Если у тебя миллион элементов в единственном списке, и удаляется в среднем половина с забыванием остатка, то это одно, а если списков много, то это немного другое. Что касается удаления, то тут вообще все кисло. Ну допустим есть:

Код

TCheckFilter=function<T>(V:T):Boolean;
TProcessMethod=procedure<T>Process(var V:T);

TSuperTList<T>=class(TList<T>)
  CheckFilter:TCheckFilter;
  ProcessMethod:TProcessMethod;
  procedure ProcessList;
end

TSuperList.ProcessList
var V:T;
begin
for V in Items do
  if CheckFilter(V) then ProcessMethod(V);
end


И вот в ProcessMethod требуется удалить элемент... Ну можно Remove(V,<Direction>) вызвать, но это поиск и работать будет просто неправильно, т. к. сбиваются внутренние счетчики. Кстати, я попробовал это сделать на TList<Integer> из 10 элементов от 1 до 10, удалилоcь только 5, причем в отличие от кривого (надо-то downto) for i:=0 to List.Count-1 do Delete List(i) никаких ошибок не выдало, что тоже плохо. Т. е. если удалять\добавлять ничего не надо, то лучше так, есл надо, то может и стоит еще один список сделать.

Это сообщение отредактировал(а) Beltar - 12.4.2013, 08:15


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
k0rvin
Дата 12.4.2013, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(Beltar @  12.4.2013,  08:04 Найти цитируемый пост)
Твой вариант означает сразу формирование еще одного экземпляра списка, т. е. его надо создать, а потом еще копировать данные,

Вовсе не обязательно, можно использовать прокси-коллекции.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Beltar
Дата 12.4.2013, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



Это как? Гугл на русском вообще такого термина не знает.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
k0rvin
Дата 12.4.2013, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(Beltar @  12.4.2013,  11:45 Найти цитируемый пост)
Это как? Гугл на русском вообще такого термина не знает. 

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

Т.е. просто filter возвращает коллекцию, которая сама не содержит элементов, а только указатель на исходную коллекцию и компаратор.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1183 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.