Umstellung von Code, wie schreibt man ein Programmcode richtig und gut

Für Fragen von Einsteigern und Programmieranfängern...
Benutzeravatar
theo
Beiträge: 9292
Registriert: Mo 11. Sep 2006, 19:01

Re: Umstellung von Code, wie schreibt man ein Programmcode richtig und gut

Beitrag von theo »

@hum4n0id3: Ich tue mich schwer, mit deinem "Service" Begriff. Ich glaube man muss da aufpassen.
Für mich ist ein Service
A: Ein Windows Dienst (Unix: Daemon) https://en.wikipedia.org/wiki/Windows_service
B: Ein Webservice: https://de.wikipedia.org/wiki/Webservice

Bei beiden Begriffen sehe ich keine Überschneidung mit deinem "Service" Beispiel.
Aus meiner Sicht sprichst du hier einfach von https://de.wikipedia.org/wiki/Modularit%C3%A4t

Benutzeravatar
stoffel_hessen
Beiträge: 66
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Re: Umstellung von Code, wie schreibt man ein Programmcode richtig und gut

Beitrag von stoffel_hessen »

hum4n0id3 hat geschrieben:
Sa 30. Jul 2022, 07:00

Code: Alles auswählen

TDeviceIPService = class
  private
    GeraeteArt : string;
    ersteZiffer : string;
    Ziffernrest : string;
    ZiffernInInteger : integer;
    StelleZwei : integer;
    i : integer;
    IPAdresse : string;
    IPAdresseGeraeteklasse : string;
  public
    property IntProp: Integer read FIntProp write FIntProp;
  end;

function DeviceIPService.getIPbyName(Ziffern : string) : string;
var 
begin
  GeraeteArt := copy (Ziffern,1,2);

  if GeraeteArt = 'xx' then IPAdresseGeraeteklasse := '10.19.2';
  if GeraeteArt = 'yy' then IPAdresseGeraeteklasse := '172.24.7.';

  ersteZiffer := copy (Ziffern,3,1);
  Ziffernrest := copy (Ziffern,4,3);
  ZiffernInInteger := strtoint (Ziffernrest);
  if RBxx.Checked
    then      // Loopback Adresse xx
      begin
        StelleZwei := 0;
        for i := 1 to 4 do
        if ZiffernInInteger > 200 then
          begin
            inc(StelleZwei);
            ZiffernInInteger := ZiffernInInteger - 200;
          end;
        IPAdresse := IPAdresseGeraeteklasse + inttostr (StelleZwei) + ersteZiffer + '.' + inttostr (ZiffernInInteger);
      end
    else IPAdresse := IPAdresseGeraeteklasse + inttostr (ZiffernInInteger);   // Loopback Adresse yy
  MaschinennameInIP := IPAdresse;
end;
Es ist eine Klasse mit deiner Funktion aus den anderen Thread. Die legst du in einer Unit ab und kannst sie von überall aufrufen, wo du sie brauchst. Statt also der Globalen Variable, eben

Code: Alles auswählen

ip := DeviceIPService.getIPbyName('xyz');
Welchen Vorteil hat es hierfür Klasse anzulegen in der die Funktion hier hinein zu packen und in einer Unit abzulegen, statt die Funktion direkt als function in einer Unit abzulegen?


hum4n0id3 hat geschrieben:
Sa 30. Jul 2022, 07:00
public
property IntProp: Integer read FIntProp write FIntProp;
end;
Was bewirkt dieser Code, was macht man damit?


hum4n0id3 hat geschrieben:
Sa 30. Jul 2022, 07:00
Das hat (für mich) folgende Vorteile. Ich sehe sofort woher meine GeräteIP kommt. Bei Fehlern muss ich also in dem Service schauen, was dort lost ist und muss nur das Service Debuggen, aber nicht das halbe/ganze Program. Bei großen Projekten mit Globalen Variablen kannst du dir nie sicher sein, wo sie alle verstreut sind und ob nur ausgelesen werden und nicht irgendwo überschrieben werden. Man kann das Service an weitere Begebenheiten anpassen, erweitern und nicht das ganze Programm.
Das habe ich verstanden und werde mich auch von den vielen Globalen Variablen verabschieden.
Ich dachte immer, es ist besser/schneller einen Wert nur einmal zu berechnen und diesen dann in einer Variable zur Verfügung zu stellen, dem ist wohl nicht so.
Gruß Christopher

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2473
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Umstellung von Code, wie schreibt man ein Programmcode richtig und gut

Beitrag von m.fuchs »

theo hat geschrieben:
Sa 30. Jul 2022, 09:40
@hum4n0id3: Ich tue mich schwer, mit deinem "Service" Begriff. Ich glaube man muss da aufpassen.
Für mich ist ein Service
A: Ein Windows Dienst (Unix: Daemon) https://en.wikipedia.org/wiki/Windows_service
B: Ein Webservice: https://de.wikipedia.org/wiki/Webservice
Das ist aber nur ein kleiner Teil dessen, was als Service beschrieben wird. Siehe auch https://de.wikipedia.org/wiki/Serviceor ... rchitektur
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
theo
Beiträge: 9292
Registriert: Mo 11. Sep 2006, 19:01

Re: Umstellung von Code, wie schreibt man ein Programmcode richtig und gut

Beitrag von theo »

m.fuchs hat geschrieben:
Sa 30. Jul 2022, 16:34
Das ist aber nur ein kleiner Teil dessen, was als Service beschrieben wird. Siehe auch https://de.wikipedia.org/wiki/Serviceor ... rchitektur
Ja, schon klar, dass es dazu mehr zu sagen gibt. Ich wollte das Thema aber nicht ins Zentrum rücken in diesem Thread.
Wie dort auch steht, geht es um "verteilte Systeme" und ich glaube nicht, dass hum4n0id3 mit seinem Beispiel darauf abgezielt hat.
Ich persönlich wusste einfach nicht, wie der Begriff "Service" in diesen Rahmen passt, deshalb der Einwand.
Lasse mich gerne belehren.

Benutzeravatar
stoffel_hessen
Beiträge: 66
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Re: Umstellung von Code, wie schreibt man ein Programmcode richtig und gut

Beitrag von stoffel_hessen »

Ich habe mich nun an einer Klasse versucht, bin aber leider gescheitert.

Code: Alles auswählen

unit Gemeinsame_Procedure_Funktionen;
{$mode ObjFPC}{$H+}
interface
uses
  Classes, SysUtils;
type
  TServicePolicyBerechnen = class
   private
    Fcir : string;
    procedure setcir(cir : string);
    function getcir : string;
  public
    property cir: string read getcir write setcir;
  end;
implementation
procedure setcir(cir : string);
begin
  Fcir := cir;
end;
end.
Es kommt die Fehlermeldung "gemeinsame_procedure_funktionen.pas(26,3) Error: Identifier not found "Fcir""
Was mache ich falsch?
Gruß Christopher

Benutzeravatar
theo
Beiträge: 9292
Registriert: Mo 11. Sep 2006, 19:01

Re: Umstellung von Code, wie schreibt man ein Programmcode richtig und gut

Beitrag von theo »

1: Wenn du nur das Feld lesen und schreiben willst, braucht es keine Methoden.

So reicht.

Code: Alles auswählen

    property Cir: string read FCir write FCir;
2: Sonst muss es heissen:

Code: Alles auswählen

procedure TServicePolicyBerechnen.setcir(ACir: string);
begin
  FCir :=  ACir;
end;  
da es eine Methode der Klasse TServicePolicyBerechnen ist.

Man kann sich die Tipperei sparen, indem man den Cursor auf

Code: Alles auswählen

procedure setcir(cir : string); 
setzt und Strg+Umschaft+C macht.
Das füllt automatisch den Code in der implementation Section ein.

Benutzeravatar
stoffel_hessen
Beiträge: 66
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Re: Umstellung von Code, wie schreibt man ein Programmcode richtig und gut

Beitrag von stoffel_hessen »

theo hat geschrieben:
Mo 1. Aug 2022, 10:51
1: Wenn du nur das Feld lesen und schreiben willst, braucht es keine Methoden.

So reicht.

Code: Alles auswählen

    property Cir: string read FCir write FCir;
2: Sonst muss es heissen:

Code: Alles auswählen

procedure TServicePolicyBerechnen.setcir(ACir: string);
begin
  FCir :=  ACir;
end;  
da es eine Methode der Klasse TServicePolicyBerechnen ist.

Man kann sich die Tipperei sparen, indem man den Cursor auf

Code: Alles auswählen

procedure setcir(cir : string); 
setzt und Shift+Ctrl+C macht.
Das füllt automatisch den Code ein.
Danke für deine schnelle Antwort :D
Eine Frage habe ich noch, kannst du mir erklären, warum du ein "A" vor die Variable "Acir" gesetzt hast, und warum meist ein "F" vor der Variablen "Fcir" verwendet wird?
Danke für deine Unterstützung
Gruß Christopher

Benutzeravatar
theo
Beiträge: 9292
Registriert: Mo 11. Sep 2006, 19:01

Re: Umstellung von Code, wie schreibt man ein Programmcode richtig und gut

Beitrag von theo »

F ist eine Konvention und steht für "Field" (Feld der Klasse).
ACir schreibe ich, damit man es nicht mit dem Property Cir verwechselt.

Ich empfehle immer noch gern diesen Überblick über OOP:
https://www.delphi-treff.de/tutorials/o ... ashkurs/8/
Ist zwar für Delphi, aber bis dahin ist alles gleich.

P.S. Du hast eine Version meines Beitrags kopiert, der noch Fehler enthielt. Das Tastaturkürzel ist oben korrigiert.

Benutzeravatar
stoffel_hessen
Beiträge: 66
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Re: Umstellung von Code, wie schreibt man ein Programmcode richtig und gut

Beitrag von stoffel_hessen »

Danke für die Erklärung.
Nun leider gleich das nächste Problem, ich muss zugeben mir fehlt völlig das Verständnis, was hier geschieht.

Ich habe in einer Unit in der Uses Gemeinsame_Procedure_Funktionen hinzugefügt.

Code: Alles auswählen

VorlageService.text := StringReplace (VorlageService.text, 'XXXCIR', TServicePolicyBerechnen.cir,  [rfReplaceAll, rfIgnoreCase]);
Es kommt beim kompilieren die Fehlermeldungen:
Config.pas(4962,105) Error: Only class methods, class properties and class variables can be referred with class references
Config.pas(4962,105) Error: Only class methods, class properties and class variables can be accessed in class methods
Gruß Christopher

Benutzeravatar
theo
Beiträge: 9292
Registriert: Mo 11. Sep 2006, 19:01

Re: Umstellung von Code, wie schreibt man ein Programmcode richtig und gut

Beitrag von theo »

Lies mal in Ruhe die OOP Einführung oben. :wink:
Du hast keine Instanz.
Z.B.

Code: Alles auswählen

MyServicePolicyBerechnen:=TServicePolicyBerechnen.Create;
TServicePolicyBerechnen allein ist nur eine Art "Muster" und noch nichts Handfestes (Im Speicher).
Erst mit Create wird eine Instanzvariable "MyServicePolicyBerechnen" benutzbar.

hum4n0id3
Beiträge: 152
Registriert: So 5. Mai 2019, 15:23

Re: Umstellung von Code, wie schreibt man ein Programmcode richtig und gut

Beitrag von hum4n0id3 »

m.fuchs hat geschrieben:
Sa 30. Jul 2022, 16:34
theo hat geschrieben:
Sa 30. Jul 2022, 09:40
@hum4n0id3: Ich tue mich schwer, mit deinem "Service" Begriff. Ich glaube man muss da aufpassen.
Für mich ist ein Service
A: Ein Windows Dienst (Unix: Daemon) https://en.wikipedia.org/wiki/Windows_service
B: Ein Webservice: https://de.wikipedia.org/wiki/Webservice
Das ist aber nur ein kleiner Teil dessen, was als Service beschrieben wird. Siehe auch https://de.wikipedia.org/wiki/Serviceor ... rchitektur
theo hat geschrieben:
Sa 30. Jul 2022, 09:40
@hum4n0id3: Ich tue mich schwer, mit deinem "Service" Begriff. Ich glaube man muss da aufpassen.
Für mich ist ein Service
A: Ein Windows Dienst (Unix: Daemon) https://en.wikipedia.org/wiki/Windows_service
B: Ein Webservice: https://de.wikipedia.org/wiki/Webservice

Bei beiden Begriffen sehe ich keine Überschneidung mit deinem "Service" Beispiel.
Aus meiner Sicht sprichst du hier einfach von https://de.wikipedia.org/wiki/Modularit%C3%A4t
Der Einwand ist berechtigt und deshalb schrieb ich unter anderem auch, das ich auch gerne Wissen würde wie es die Lazarus-Leute lösen. In PHP nutze ich unter anderem ein Framework, das mit Servicen arbeitet. Das sind Klassen die ganz bestimmte Dienste bereit stellen. Der Vorteil ist das man eine bestimmte Struktur hat und jedes Teil einer Software bestimmte Aufgaben besitzt. Somit versucht man große Projekte zu ordnen und bei Problemen sucht man eben in Teilbereichen und nicht in der ganzen Software.

Da mir dieser Ansatz gut gefällt, nutze ich es auch außerhalb von PHP und schau wie es dort gelöst wird.

Benutzeravatar
theo
Beiträge: 9292
Registriert: Mo 11. Sep 2006, 19:01

Re: Umstellung von Code, wie schreibt man ein Programmcode richtig und gut

Beitrag von theo »

@hum4n0id3: So gesehen ist das eine recht grundlegende Angelegenheit, die so tatsächlich auch an die SOA denken lässt.
https://de.wikipedia.org/wiki/Modulare_Programmierung
Zum Zuge kommt das Prinzip insb. durch die OOP.
https://de.wikipedia.org/wiki/Objektori ... rammierung

Es gibt hier sicher User, die das theoretisch besser einordnen können als ich.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5250
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Umstellung von Code, wie schreibt man ein Programmcode richtig und gut

Beitrag von af0815 »

Das ist die Diskussion, wieviel OOP und wieviel Interface.

Grundlegend hat beides seine Berechtigung. OOP kann leicht überbewertet werden. Interfaces auch :D
Die Frage ist immer, wo macht was einen Sinn. OOP wenn die Dinge wirklich Miteinander einen Kontext haben. Das zu durchbrechen und dann über Interfaces zu gehen, dann, wenn der Zudammenhang nicht mehr so gegeben ist. Es gab da ein paar englischsprachige Publikationen dazu, aber die Bücher zu bekommen über ein Antiquariat ist auch nicht so leicht. Wenn ich aus dem Urlaub kommen suche ich mir die ISBN mal raus.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
stoffel_hessen
Beiträge: 66
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Re: Umstellung von Code, wie schreibt man ein Programmcode richtig und gut

Beitrag von stoffel_hessen »

theo hat geschrieben:
Mo 1. Aug 2022, 11:17
Lies mal in Ruhe die OOP Einführung oben. :wink:
Du hast keine Instanz.
Z.B.

Code: Alles auswählen

MyServicePolicyBerechnen:=TServicePolicyBerechnen.Create;
TServicePolicyBerechnen allein ist nur eine Art "Muster" und noch nichts Handfestes (Im Speicher).
Erst mit Create wird eine Instanzvariable "MyServicePolicyBerechnen" benutzbar.
Das habe ich gestern gelesen und bin nun auch ein Stück weiter, funktionieren tut es aber nicht.
Das Kompilieren klappt nun, aber zur Laufzeit bekomme ich beim Aufrufvon bbb.create eine Fehlermeldung, siehe Screenshot
Fehlermeldung bbb.create.jpg
Fehlermeldung bbb.create.jpg (13.19 KiB) 377 mal betrachtet
Das ist der Code

Code: Alles auswählen

procedure XXX.BandbreiteCPE;
var bbb : TServicePolicyBerechnen;
begin
  bbb.Create;

Code: Alles auswählen

unit XXX_Gemeinsame_Procedure_Funktionen;
{$mode ObjFPC}{$H+}
interface
uses
  Classes, SysUtils;
type
  { TServicePolicyBerechnen }
  TServicePolicyBerechnen = class
   private
    Fqos, Fcir, Fpir, Fcbs, Fpbs : string;
    Fqos_core, Fcir_core, Fpir_core, Fcbs_core, Fpbs_core : string;
    function BandbreiteBerechnen (Bandbreite : string) : string;
  public
    property qos: string read Fqos write Fqos;
    property cir: string read Fcir write Fcir;
    property pir: string read Fpir write Fpir;
    property cbs: string read Fcbs write Fcbs;
    property pbs: string read Fpbs write Fpbs;
    property qos_core: string read Fqos_core write Fqos_core;
    property cir_core: string read Fcir_core write Fcir_core;
    property pir_core: string read Fpir_core write Fpir_core;
    property cbs_core: string read Fcbs_core write Fcbs_core;
    property pbs_core: string read Fpbs_core write Fpbs_core;
    procedure ServicePolicyParameter (Aqos: string; Adownload : string; Aupload : string; ASprachKanaele : string);
  end;
implementation
function TServicePolicyBerechnen.BandbreiteBerechnen (Bandbreite : string) : string;
var UebergebenBandbreite : integer;
begin
  UebergebenBandbreite := strtoint (Bandbreite) * 10 * 66;
  result := inttostr ( UebergebenBandbreite );
end;
//***** ServicePolicy einträge Berechnen
procedure TServicePolicyBerechnen.ServicePolicyParameter(Aqos: string; Adownload: string; Aupload: string; ASprachKanaele : string);
var cbsInt : integer;
    pbsInt : integer;
begin
  if Aqos = 'BE'
    then
      begin
        // BE Bandbreite CPE
        self.qos:='BE';
        self.cir:='64';
        self.pir := IntToStr ( 1024 * strtoint (Aupload));
        self.cbs := '1000';
        pbsInt := strtoint (Aupload) * 16000;
        if pbsInt > 10000000 then self.pbs := '10000000'
                             else self.pbs := IntToStr (pbsInt);
        // BE Bandbreite Core
        self.qos_core := 'BE';
        self.cir_core := '64';
        self.pir_core := IntToStr ( 1024 * strtoint (Adownload));
        self.cbs_core := '1000';
        pbsInt := strtoint (Aupload) * 16000;
        if pbsInt > 10000000 then self.pbs_core := '10000000'
                             else self.pbs_core := IntToStr (pbsInt);
      end;

  if Aqos = 'AF66'
    then
      begin
        // AF66 Bandbreite CPE
        self.qos := 'AF66';
        self.cir := BandbreiteBerechnen (Aupload);
        self.pir := IntToStr ( 1024 * strtoint (Aupload));
        cbsInt := strtoint (Aupload) * 10560;
        if cbsInt > 10000000 then self.cbs := '10000000'
                             else self.cbs := IntToStr (cbsInt);
        pbsInt := strtoint (Aupload) * 16000;
        if pbsInt > 10000000 then self.pbs := '10000000'
                             else self.pbs := IntToStr (pbsInt);
        // AF66 Bandbreite Core
        self.qos_core := 'AF66';
        self.cir_core := BandbreiteBerechnen (Adownload);
        self.pir_core := IntToStr ( 1024 * strtoint (Adownload));
        cbsInt := strtoint (Adownload) * 10560;
        if cbsInt > 10000000 then self.cbs_core := '10000000'
                             else self.cbs_core := IntToStr (cbsInt);
        pbsInt := strtoint (Aupload) * 16000;
        if pbsInt > 10000000 then self.pbs_core := '10000000'
                             else self.pbs_core := IntToStr (pbsInt);
      end;

   if Aqos = 'EF'
     then
       begin
         // EF Bandbreite CPE
         self.qos := 'EF';
         self.cir := IntToStr ( 1024 * strtoint (Aupload));
         self.pir := self.cir;
         cbsInt := strtoint (Aupload) * 16000;
         if cbsInt > 10000000 then self.cbs := '10000000'
                              else self.cbs := IntToStr (cbsInt);
         self.pbs := self.cbs;
         // EF Bandbreite Core
         self.qos_core := 'EF';
         self.cir_core := IntToStr ( 1024 * strtoint (Aupload));
         self.pir_core := self.cir_core;
         cbsInt := strtoint (Aupload) * 16000;
         if cbsInt > 10000000 then self.cbs_core := '10000000'
                              else self.cbs := IntToStr (cbsInt);
         self.pbs_core := self.cbs_core;
       end;

   if Aqos = 'ST'
     then
       begin
         // EF Bandbreite CPE
         self.qos := 'EF';
         self.cir := IntToStr ( 128 * StrToInt(ASprachKanaele));
         self.pir := self.cir;
         self.cbs := '1000';
         self.pbs := self.cbs;
         // EF Bandbreite Core
         self.qos_core := self.qos;
         self.cir_core := self.cir;
         self.pir_core := self.pir;
         self.cbs_core := '1000';
         self.pbs_core := self.cbs_core;
       end;
end;
end.
Was habe ich nun wieder falsch gemacht???
Gruß Christopher

Benutzeravatar
stoffel_hessen
Beiträge: 66
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Re: Umstellung von Code, wie schreibt man ein Programmcode richtig und gut

Beitrag von stoffel_hessen »

Korrigiere mich mal selbst.
Richtig ist

Code: Alles auswählen

 bbb:= TServicePolicyBerechnen.Create;  
Gruß Christopher

Antworten