AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Subrange als Parameter?

Ein Thema von silver-moon-2000 · begonnen am 27. Apr 2012
Antwort Antwort
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#1

Subrange als Parameter?

  Alt 27. Apr 2012, 17:15
Delphi-Version: XE
Hallo zusammen,

ich wieder mal mit einer dämlichen Frage:

Ich habe eine Reihe von Objekten in einer ObjectList. Diese Objekte haben eine Eigenschaft "Level", welche ich setzen muss.

Dabei ist der Aufzählungs-Typ TLevel aufgeteilt in mehrere SubRanges (hier mal zwei zur Veranschaulichung, sonst noch deutlich mehr).
Und das Level, das den Objekten zugeordnet werden soll, richtet sich nach den Subranges. Zusätzlich gibt es noch eine weitere Reihe von Einflussfaktoren, sodass ich alles in eine "zentrale" Funktion auslagern wollte.

Momentan löse ich das höchst umständlich über einen weiteren Index, den ich in getLevels über ein Case abfrage.

Delphi-Quellcode:
type TLevel = (lev00, lev01, lev02, lev03, lev04, lev05, lev06, lev07, lev08, lev09, lev10);
     SLevelRangeLow = lev01 .. lev05;
    SLevelRangeHigh = lev06 .. lev10;
        
type TIntraLevelRangeMode = (irBase, irCenter, irTop);
   

procedure TMyClass.modifyQueue;
  function getLevel(mode : TIntraLevelRangeMode; subRangeValue : Integer) : TLevel;
  begin
  //1 == SLevelRangeLow
  //2 == SLevelRangeHigh
    case mode of
      irBase : case SubRangeValue of
                1 : Result := Low(SLevelRangeLow);
                2 : Result := Low(SLevelRangeHigh);
               end;
      irCenter : case SubRangeValue of
                1 : Result := TLevel((Ord(Low(SLevelLow)) + Ord(High(SLevelLow))) div 2);
                2 : Result := TLevel((Ord(Low(SLevelMiddle)) + Ord(High(SLevelMiddle))) div 2);
               end;
      irTop : case SubRangeValue of
                1 : Result := High(SLevelRangeLow);
                2 : Result := High(SLevelRangeHigh);
               end;
    end;
  end;
begin
  //1 == SLevelRangeLow
  //2 == SLevelRangeHigh
  FMyObjectList.Items[FMyIndex ].Level := getLevel(irBase, 1);
  FMyObjectList.Items[FMyIndex + 1].Level := getLevel(irBase, 2);
  FMyObjectList.Items[FMyIndex + 2].Level := getLevel(irTop , 1);
  FMyObjectList.Items[FMyIndex + 3].Level := getLevel(irTop , 2);
end;
Erstens fehleranfällig, zweitens DRY-Prinzip?

Und da sowohl TIntraLevelRangeMode mehr als die zwei Werte umfasst und es auch deutlich mehr Subranges gibt, ist die Funktion getLevels wahnsinnig aufgeblasen.

Das muss doch auch einfacher gehen? Mir schwebt soetwas vor wie:
Delphi-Quellcode:
procedure TMyClass.modifyQueue;
  function getLevel(mode : TIntraLevelRangeMode; subRange : ???) : TLevel; //<----------
  begin
    case mode of
      irBase : Result := Low(subRange);
      irCenter : Result := TLevel((Ord(Low(SubRange)) + Ord(High(SubRange))) div 2)
     irTop : Result := High(subRange);
    end;
  end;
begin
  FMyObjectList.Items[FMyIndex ].Level := getLevel(irBase, SLevelRangeLow);
  FMyObjectList.Items[FMyIndex + 1].Level := getLevel(irBase, SLevelRangeHigh);
  FMyObjectList.Items[FMyIndex + 2].Level := getLevel(irTop , SLevelRangeLow);
  FMyObjectList.Items[FMyIndex + 3].Level := getLevel(irTop , SLevelRangeHigh);
end;
nur welchen Typ hat der Subrange?
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz