Информация об изменениях

Сообщение Re[4]: Delphi и велосипедирование от 24.06.2024 19:08

Изменено 24.06.2024 19:09 swame

Re[4]: Delphi и велосипедирование
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, rudzuk, Вы писали:


R>>Это, конечно, глупость несусветная. Особенно про перегрузку операторов (запахло костыльным дженерик-мафом ).

S>При чём тут женерик-маф? Я на Delphi оттрубил своё по полной программе, так что пишу с полной ответственностью.
S>Банально никаких коллекций на Delpgi не было, кроме TList.
S>Сделать простую штуку типа "отсортировать список по пользовательскому критерию" — боль, ужас, унижение.

тут жопа только в бестолковом примере, писанном кем — то не знающим языка.
Нужно применять адекватные классы, в данном случае есть класс TStringList, любимый формоклепателями.
Это если говорить о додженериковом языке.

S>Ага. Расскажите мне, во сколько строк кода запишется на Object Pascal какая-нибудь банальщина типа "обойти граф, заданный моей объектной моделью, в глубину, отфильтровав по параметру, частично заданному пользователем, и собрать некую агрегатную величину". Ну там — берём AST программы, ищем узлы-референсы, заимпортированные из модуля X, для них считаем сумму условной вычислительной сложности.


  типа такого (код из нашего комплекса)?

class function TMatchAPI.outside(aNB: TNB; aMode: TOutsideMode): RArray<TNB>;
var
  lCEs: RArray<TCE>;
  lRules: TCEFetchRules;
begin
  Result := RArray<TNB>.init;
  if TCEAPI.globalId(aNB) <> '' then
  begin
    Result.add(aNB);
    exit;
  end;

  lRules.init;
  lRules := lRules +
    TCERules.reducerExtraTerminals +
    function(aTerminal: TCIMTopologyTerminal): TFetchAction
    begin
      Result := faContinue;
      if isBreakObject(aTerminal.Element, aMode) then
        Result := faBreakAndFetch;
    end;
  lRules := lRules +
    function (aFrom: TCIMTopologyTerminal; var aTo: RArray<TCIMTopologyTerminal>): Boolean
    var
      lNewTo: RArray<TCIMTopologyTerminal>;
    begin
      Result := True;
      lNewTo :=
        aTo.filter(
          function (aT: TCIMTopologyTerminal): Boolean
          begin
            Result := isBreakObject(aT.Element, aMode);
          end
        );
      if lNewTo.count > 0 then
      begin
        aTo := lNewTo;
        exit;
      end;

      lNewTo :=
        aTo.filter(
          function (aT: TCIMTopologyTerminal): Boolean
          var
            lCandle: TCE;
          begin
            lCandle := TCEAPI.candleLine(aT.Element);
            Result := (lCandle <> nil) and (lCandle.terminalsS.map<TCE>(TCEAPI.connectedCE).count = 1) and isBreakObject(lCandle, aMode);
          end
        );
      if lNewTo.count > 0 then
      begin
        aTo := lNewTo;
        exit;
      end;
    end;

  Result :=
    TRStream<TNB>.just(aNB)
      .map(TCEAPI.extractReducers)
      .map<TCE>(TCEAPI.ce)
      .map<TNB>(
        procedure (aCE: TCE; var aMap: TProc<TNB>)
        begin
          TCEAPI.iterateTopology(aCE, lRules)
                .map<TNB>(
                  procedure (aCE: TCE; var aMap: TProc<TNB>)
                  var
                    lNB: TNB;
                  begin
                    if aCe.IsChildOrEqual(ttcTransformerWinding) then
                      lNB := TCEAPI.grpFromWinding(aCe as TTransformerWinding)
                    else
                      lNB := aCE;
                    if isNodeObject(aCE) and ((aMode = omNearest) or (TCEAPI.globalId(lNB) <> '')) then
                      aMap(lNB);
                  end)
                .forEach(aMap);
        end
      )
      .distinct()
      .toArray();
end;


Ненавижу такое написание.
1. Не поддается отладке отладчиком.
2. сложно профилировать. сложно найти "бутылочное горлышко" производительности.
3. сложно рефакторить, сложно определяется на каждом этапе какая там структура данных на выходе.
4. нереально повторно использовать код, записать похожие алгоритмы.
5. перегружает компилятор.

S>На более-менее любом современном языке это будет весьма простой генератор/итератор, за которым .filter(...).map(...).reduce(...).

S>На Delphi остаётся только пердолиться с "процедурными типами" и/или Visitor Pattern.

R>>

S>Возможно, на современном Delphi ситуация как-то поменялась; в том, который был актуален во времена расцвета его популярности, всё это суровая правда.
Re[4]: Delphi и велосипедирование
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, rudzuk, Вы писали:


R>>Это, конечно, глупость несусветная. Особенно про перегрузку операторов (запахло костыльным дженерик-мафом ).

S>При чём тут женерик-маф? Я на Delphi оттрубил своё по полной программе, так что пишу с полной ответственностью.
S>Банально никаких коллекций на Delpgi не было, кроме TList.
S>Сделать простую штуку типа "отсортировать список по пользовательскому критерию" — боль, ужас, унижение.

тут жопа только в бестолковом примере, писанном кем — то не знающим языка.
Нужно применять адекватные классы, в данном случае есть класс TStringList, любимый формоклепателями.
Там сортировка вызывается 1 строчкой.
Это если говорить о додженериковом языке.

S>Ага. Расскажите мне, во сколько строк кода запишется на Object Pascal какая-нибудь банальщина типа "обойти граф, заданный моей объектной моделью, в глубину, отфильтровав по параметру, частично заданному пользователем, и собрать некую агрегатную величину". Ну там — берём AST программы, ищем узлы-референсы, заимпортированные из модуля X, для них считаем сумму условной вычислительной сложности.


  типа такого (код из нашего комплекса)?

class function TMatchAPI.outside(aNB: TNB; aMode: TOutsideMode): RArray<TNB>;
var
  lCEs: RArray<TCE>;
  lRules: TCEFetchRules;
begin
  Result := RArray<TNB>.init;
  if TCEAPI.globalId(aNB) <> '' then
  begin
    Result.add(aNB);
    exit;
  end;

  lRules.init;
  lRules := lRules +
    TCERules.reducerExtraTerminals +
    function(aTerminal: TCIMTopologyTerminal): TFetchAction
    begin
      Result := faContinue;
      if isBreakObject(aTerminal.Element, aMode) then
        Result := faBreakAndFetch;
    end;
  lRules := lRules +
    function (aFrom: TCIMTopologyTerminal; var aTo: RArray<TCIMTopologyTerminal>): Boolean
    var
      lNewTo: RArray<TCIMTopologyTerminal>;
    begin
      Result := True;
      lNewTo :=
        aTo.filter(
          function (aT: TCIMTopologyTerminal): Boolean
          begin
            Result := isBreakObject(aT.Element, aMode);
          end
        );
      if lNewTo.count > 0 then
      begin
        aTo := lNewTo;
        exit;
      end;

      lNewTo :=
        aTo.filter(
          function (aT: TCIMTopologyTerminal): Boolean
          var
            lCandle: TCE;
          begin
            lCandle := TCEAPI.candleLine(aT.Element);
            Result := (lCandle <> nil) and (lCandle.terminalsS.map<TCE>(TCEAPI.connectedCE).count = 1) and isBreakObject(lCandle, aMode);
          end
        );
      if lNewTo.count > 0 then
      begin
        aTo := lNewTo;
        exit;
      end;
    end;

  Result :=
    TRStream<TNB>.just(aNB)
      .map(TCEAPI.extractReducers)
      .map<TCE>(TCEAPI.ce)
      .map<TNB>(
        procedure (aCE: TCE; var aMap: TProc<TNB>)
        begin
          TCEAPI.iterateTopology(aCE, lRules)
                .map<TNB>(
                  procedure (aCE: TCE; var aMap: TProc<TNB>)
                  var
                    lNB: TNB;
                  begin
                    if aCe.IsChildOrEqual(ttcTransformerWinding) then
                      lNB := TCEAPI.grpFromWinding(aCe as TTransformerWinding)
                    else
                      lNB := aCE;
                    if isNodeObject(aCE) and ((aMode = omNearest) or (TCEAPI.globalId(lNB) <> '')) then
                      aMap(lNB);
                  end)
                .forEach(aMap);
        end
      )
      .distinct()
      .toArray();
end;


Ненавижу такое написание.
1. Не поддается отладке отладчиком.
2. сложно профилировать. сложно найти "бутылочное горлышко" производительности.
3. сложно рефакторить, сложно определяется на каждом этапе какая там структура данных на выходе.
4. нереально повторно использовать код, записать похожие алгоритмы.
5. перегружает компилятор.

S>На более-менее любом современном языке это будет весьма простой генератор/итератор, за которым .filter(...).map(...).reduce(...).

S>На Delphi остаётся только пердолиться с "процедурными типами" и/или Visitor Pattern.

R>>

S>Возможно, на современном Delphi ситуация как-то поменялась; в том, который был актуален во времена расцвета его популярности, всё это суровая правда.