AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials [Chrome] Der Blick über den Tellerrand
Tutorial durchsuchen
Ansicht
Themen-Optionen

[Chrome] Der Blick über den Tellerrand

Ein Tutorial von Christian S. · begonnen am 21. Mai 2006 · letzter Beitrag vom 29. Jul 2007
Antwort Antwort
Seite 3 von 7     123 45     Letzte »    
Benutzerbild von Christian S.
Christian S.
Registriert seit: 19. Apr 2003
Der Blick über den Tellerrand


In den letzten Tagen habe ich mich eingehend mit einem Produkt beschäftigt, welches meines Erachtens viel zu wenig Beachtung erhalten hat. Die Rede ist von RemObjects Chrome. Chrome ist ein Pascalcompiler, welcher sich in das Visual Studio integriert und sowohl .NET 1.1 als auch .NET 2.0 vollständig unterstützt. Außerdem bietet Chrome eine Vielzahl von Sprachfeatures, die es klar von anderen Pascaldialekten wie Delphi oder Free Pascal unterscheiden.



Meine Highlights
Ich möchte an dieser Stelle keine komplette Liste abarbeiten, das darf jeder auf der Seite des Herstellers selber tun. In diesem Artikel werde ich eine ganz subjektive Auswahl treffen. Da ich noch nicht allzu lange mit Chrome arbeite, werden das wahrscheinlich noch nicht einmal die wirklichen "Highlights" der Sprache sein.

Als Erstes möchte ich auf Dinge eingehen, die der Compiler für den Programmierer erledigt. Und davon gibt es einige. Vor allem anderen gefällt mir dabei die so genannte "Type Inference", was soviel heißt, dass der Compiler nicht nur die Typen meiner Variablen erkennt, sondern erkennt, dass ich überhaupt eine neue Variable einführen will. Letzteres gilt für Variablen mit begrenzter Lebensdauer (also z.B. in with-Anweisungen).

Wie sieht das genau aus? So z.B.:
Delphi-Quellcode:
with foo := new Tfoo() do
begin
  foo.DoSomething();
end;
Wir müssen foo nirgendwo deklarieren und wir müssen auch nicht den Typ von foo angeben.

Ähnlich einfach kann man bei Bedarf neue Variablen einführen.
Delphi-Quellcode:
begin
  var bar := new TBar();
end;
Diese Zeile steht, wie man sieht, irgendwo im Quelltext und nicht im Deklarationsteil.

Ähnlich praktisch ist auch die Deklaration von Zählern:
for i : Integer := 0 to 5 do In der for-schleife muss man diese Syntax wählen, welche auch eine Variablendeklaration enthält. Sie ist mit den oben demonstrierten Syntaxschemas kompatibel. Type Inference ist das dann natürlich nicht mehr.

Ein guter Punkt, um zum nächsten Beispiel zu kommen, wo der Compiler Arbeit übernimmt. Oft kommt es vor, dass eine Property einfach nur ein privates Feld kapselt, also gar keine get- und set-Methoden vorhanden sind.

Hier hilft Chrome, den ewig gleichen Standardcode zu vermeiden, indem es folgende Syntax erlaubt:
Delphi-Quellcode:
type
  TFoo = public class
  public
    property aProp : String;
  end;
Mehr ist nicht nötig, um eine Property anzulegen, der Rest wird implizit deklariert. (Obiges Beispiel zeigt ein weiteres Chrome-Feature: Typensichtbarkeit wird vollständig unterstützt.)

Kommen wir zu Kleinigkeiten, bei denen man erst einmal denkt, dass das nicht erwähnenswert ist. Aber zumindest mir geht es so, dass die Kleinigkeiten, denen man immer wieder begegnet, einen hohen Stellenwert erhalten. Da wäre zum einen die exit-Methode, der man einen Parameter übergeben kann. Anstatt also
Delphi-Quellcode:
if aVal = anotherVal then
begin
  result := someVal;
  exit;
end;
schreiben zu müssen, reicht ein if aVal = anotherVal then exit(someVal); . Wie gesagt, eine Kleinigkeit, aber man gewöhnt sich dran

Nächste Kleinigkeit: "empty". Schonmal eine Methode gehabt, die im interface stehen musste, aber nur ein Dummy war? Kein Problem. Einfach folgendermaßen deklarieren:
Delphi-Quellcode:
type
  TFoo = public class
  public
    method aMethod; empty;
  end;
Im implementation-Teil muss kein Dummy mehr angelegt werden. Kleinigkeiten, an die man sich gewöhnt ...



Auffällige Sprachunterschiede zu Delphi
Ich könnte meine Highlights noch fortsetzen und je länger ich mit Chrome arbeite, werde ich Neue entdecken. Aber das würde wohl mit der Zeit langweilig werden. Daher will ich noch ein paar auffällige Sprachunterschiede vorstellen, die ich nicht so liebgewonnen habe, die aber trotzdem von Bedeutung sind.

Allen voran wäre da die Unterstützung von Generics. Sie sind eine der Voraussetzungen, die eine Sprache für .NET 2.0 erfüllen muss, und sie haben daher auch Einzug in Chrome gefunden. Die Syntax ist praktisch dieselbe wie in C#:
var li : List<Integer> := new List<Integer>(); oder auch (Zitat aus der Chrome-Doku)
Delphi-Quellcode:
type
  MyArrayList<T> = public class(ArrayList, IPersistentCollection)
    where T is PersistentObject, T has constructor;
Also auch die Unterstützung für Constraints ist da.

Weil ich an dieser Stelle nicht weiter auf Generics eingehen möchte (das ginge zu weit), möchte ich Euer Augenmerk auf das erste Code-Beispiel zu Generics lenken und zwar auf die Konstruktor-Syntax. Da .NET keine Konstruktoren mit Namen kennt, wurde auch in Chrome darauf verzichtet. Anstatt einen Defaultnamen wie z.B. "Create" und die Funktionensyntax zu verwenden, wurde auf die von C# bekannte new-Syntax zurückgegriffen. Es ist Geschmackssache, was man besser findet, logisch erscheinen mir beide. Ich muss aber zugeben, dass es am Anfang komisch aussieht, in Pascal mit "new" zu arbeiten

Ein weiterer Sprachunterschied zu Delphi sind die so genannten "Class Contracts". Class Contracts dienen der Überprüfung von Bedingungen, die vor / nach der Ausführung einer Methode wahr sein müssen (require / ensure) bzw. innerhalb einer Klasse immer erfüllt sein müssen (Invariants).
An dieser Stelle sei erneut ein Beispiel aus der Chrome-Doku zitiert:
Delphi-Quellcode:
method MyObject.DivideBy(aValue: Integer);
require
  aValue <> 0;
begin
  MyValue := MyValue/aValue;
end;
Es spricht eigentlich für sich, was hier passiert. Es wird sichergestellt, dass aValue nicht Null ist, weil durch Null zu teilen im Allgemeinen keine gute Idee ist. Invariants möchte ich an folgendem Beispiel demonstrieren:
Delphi-Quellcode:
type
  TComplex = public class
  public
    property length : Double;
  public invariants
    length >= 0;
  end;
Hier wird festgelegt, dass die Eigenschaft "length" niemals kleiner Null sein darf. Wird sie es doch, wird eine Ausnahme geworfen. (Übrigens wäre diese Klasse so fertig, im implementation-Teil muss nichts mehr gemacht werden.)

Dass auf jeden Topf ein Deckel passt, ist bekannt. In Delphi muss man die Deckel allerdings selber aussortieren, was in Chrome für einen erledigt wird. Ein Beispiel (wieder aus der Doku) macht es deutlich:

Delphi-Quellcode:
   
   x := new ArrayList();
   x.add('Test');
   x.add(123);
  for each matching S: String in x do
     console.writeline(s);
Anstatt, dass die foreach-Schleife stupide alle Elemente durchläuft und man selber dafür verantwortlich ist zu schauen, ob es sich um den richtigen Typen handelt, werden hier nur bei den Elementen in den Schleifenrumpf gesprungen, welche der matching-Bedingung entsprechen.

Den letzten hier genannten Sprachunterschied möchte einfach mal unkommentiert stehen lassen
Delphi-Quellcode:
  case forum of
    'df': DoDelphiForum;
    'csf': DoCSharpForum;
    'dl': DoDelphiLibrary;
    'csl': DoCSharpLibrary;
    else DoEntwicklerEcke;
  end;

Nobody is perfect
Doch auch Chrome hat Schwächen. Die liegen ganz klar nicht in der Sprache, sondern im Editor. Da ich momentan mit einem RC arbeite, will ich auf Fehler hier nicht eingehen, die können in der Final schon behoben sein. Es geht mir viel mehr darum, dass viele Refactoring-Funktionen entweder vollständig fehlen oder ungenügend umgesetzt wurden.

Smart Editing nennt sich das, was Chrome an Refactoring liefert. Doch was ist das? Zuerst einmal wären da die Navigation zwischen implementation- und interface-Abschnitt, wie man sie aus Delphi kennt. Ebenso die Klassenvervollständigung. Code Folding ist ebenfalls nichts Neues und das man Parameterlisten in einem Hint erhält, wenn man eine Funktion aufrufen will, ist inzwischen einfach Standard.

Die Code-Vervollständigung hat in Chrome einige wünschenswerte und praktische Ergänzungen erfahren. So wird das Erstellen von Properties dadurch unterstützt, dass man automatisch die entsprechenden get- und set-Methoden oder private Felder anlegen kann. Auch bietet die Vervollständigung beim Anlegen von Klassenoperatoren eine Liste der verfügbaren Operatoren. Eine Kleinigkeit, an die man sich wieder schnell gewöhnt: Tippt man "begin" und die Eingabetaste, wird das "end;" ergänzt und der Cursor an die richtige Stelle gesetzt.

Ein guter Ansatz, aber absolut nicht zu Ende gedacht, ist das Sync Rename. Damit sollte es eigentlich möglich sein, Mehtoden oder Klassen einfach umzubenennen. Leider heisst "Sync" hierbei nur, dass Änderung an diesen beiden Dingen (also Methode- und Klassennamen, anderes wird nicht unterstütz) synchron in interface- und implementation-Abschnitt gemacht wird. Aber im implementation-Abschnitt auch nur im Kopf der Methoden, nicht im Code. Und da muss ich einfach mal Fragen: Was soll das? Ich habe die Methode zigmal im Quelltext stehen und der ersetzt mir automatisch das Vorkommen, was ich am einfachsten selber finden kann? Na, vielen Dank auch.

Dann wäre da noch die automatische Deklaration von Variablen. Setzt man den Cursor auf einen Bezeichner und drückt eine Tastenkombination, erstellt Chorme eine entsprechende Property (Bezeicher fängt mir großen Buchstaben an), ein privates Feld (Bezeichner fängt mit "f" an) und ansonsten eine lokale Variable. Eine andere Tastenkombination erstellt eine neue Methode

Mehr an Refactoring gibt es nicht und das muss man einfach mal als mager bezeichnen. Da ist man deutlich mehr gewohnt und eine Firma, die ganz klar eine Konkurrenz zu Delphi präsentieren will, sollte auch auf diesem Bereich etwas mehr zu bieten haben. Und da muss man klar sagen: Delphi 2005 (2006 hab ich nicht) bietet deutlich mehr Komfort in diesem Bereich.


Mein Fazit
Ich habe den Kauf von Chrome nicht bereut und arbeite sehr gerne damit. Die Sprache bietet so viele Features, dass das Arbeiten trotz des dürftigen Editors Spaß macht. Ich entdecke immer wieder neue Features, die mir ein "Cool!" entlocken. Kurz um: Bei Chrome hat man einfach mal den Staub von der Sprache Pascal gewischt und das ist auch gut so. Das fehlende Refactoring ist ein deutlicher Mangel, aber es hat mich bisher nicht soweit gestört, dass es in mir Zweifel am Kauf von Chrome geweckt hätte.

Dieser Artikel kann auch auf meiner Homepage abgerufen werden: http://www.christian-stelzmann.de/artikel/chrome.htm
Crossposting Entwickler-Ecke: http://www.delphi-forum.de/viewtopic.php?t=60346



//edit: Link zur Chrome-Homepage eingefügt
 
Daniel

 
Delphi 10.4 Sydney
 
#21
  Alt 21. Mai 2006, 16:16
@Hansa & Frickeldrecktuxer_TM: Gleich sperre ich euch beide aus diesem Thread aus.



Meine Güte - seit Jahren knallt Ihr beiden immer wieder aneinander und lernt nichts daraus. Wieviele Threads habt Ihr beiden mit Euren kindischen Kleinkriegen bereits zerstört? Ist das Geltungsbewusstsein tatsächlich so groß, dass die sachliche Diskussion egal ist? Wenn dies der Fall ist, solltest Du über Konsequenzen nachdenken.

Ich werde beide Beiträge gleich deaktivieren und bitte darum, diese Diskussion sachlich fortzuführen.


[edit]
Mal sehen, vielleicht geht's ja auch ohne deaktivieren.

@Rest: Bitte ignoriert die beiden.
[/edit]

[edit=alcaeus]Name korrigiert Mfg, alcaeus[/edit]
Daniel R. Wolf
  Mit Zitat antworten Zitat
Elvis

 
Delphi 2010 Professional
 
#22
  Alt 21. Mai 2006, 17:00
Zitat von lizardking:
Ein Beispiel fuer ein Feature, was mich persoenlich stoeren wuerde. In Delphi saehe es ja so aus :
Delphi-Quellcode:
type
  TFoo = public class
  private
    FProp: String;
  public
    property Prop : String read FProp write FProp;
  end;
Du hast die Möglichkeit auch in Chrome. Sie macht nur wenig Sinn, da das Feld nur sinnlos in Editor und Code completion rumliegen würde.
In so einem Fall wird der Compiler _innerhalb_ der Klasse das Feld benutzen und zwar solange das Feld entweder implizit angelegt(wie in Christians Code) oder einfach einen inline setter hat (wie in deinem Code).
Zitat:
Wenn mich diese klare Trennung von Feldvariablen und Properties nicht sonderlich kuemmert, dann kann ich zur Not auch einfach die Variablen als public deklarieren
Da Chrome aber eine .Net Sprache ist, drehen sich die Räder ein wenig anders.
Zugriff auf Felder ist da mehr ein PITA: Class invariants können nicht bei Änderungen ablaufen, außerdem würde eine später eingefügte Property mit gleichem Typ & Namen einen breaking Change bedeuten (auf IL Ebene[1]). Nicht zu vergessen, dass DataBinding nur auf Properties funktioniert.
Es gibt nur seeehr wenige Fälle, in denen man ein Feld öffentlich sichtbar machen sollte. Die meisten .Net Devs werden solch einen Fall wohl nie erleben.
Zitat:
Jetzt hab ich ein wenig mehr Code, wenn ich aber in der Klasse TFoo arbeite, weiss ich immer genau was passiert. Wenn ich dort naemlich "fremden" Code von Kollegen durchgehe, kann ich bei jeder Zuweisung erstmal nachschauen, ob nicht eine Setter-Methode noch mehr macht als nur die Variable zu setzen.
Für sowas gibt es in Object pascal interface sections, eine bessere Zusammenfassung einer Klasse wirst du so schnell nicht kriegen.
Zitat:
Wenn sich aber jeder daran haelt innerhalb der Klasse nur auf die Feldvariablen zuzugreifen, kann ich auf einen Blick ausschliessen, dass noch irgendwas sonst passiert.
Wenn sich jeder daran halten würde hättest du wirlich Pech. Du könntest keine Events auslösen auf die sich DataBinding registriert(siehe INotifyPropertyChange im .Net SDK) oder die notwendig sind, damit andere Teile deiner App von dieser Änderung erfahren können. Deine Syntax oben benutze ich immer dann, wenn ich tatsächlich irgendwo direkt auf das Feld schreiben will oder wenn ich einen speziellen Setter implementieren will.
Da ich aber vorher schon die implizite Property stehen hatte ist das kein breaking Change mehr.[1]

[1]Es sind einfach ganz andere IL OpCodes und Abläufe im Spiel ob man nun ldfld XXX oder call get_XXX auszuführt. -> Jede Assembly, die deine Binary benutzt wird definitv alle Viere von sich strecken wenn du von einem öffentlichen/protected Feld auf eine Property wechselst.

btw:@Daniel
Mit ein wenig Stolz kann ich von mir behaupten, dem unwiderstehlichen Drang, dem großen H einen Einlauf zu verpassen, erfolgreich widerstanden zu haben
Robert Giesecke
  Mit Zitat antworten Zitat
Daniel

 
Delphi 10.4 Sydney
 
#23
  Alt 21. Mai 2006, 17:10
Zitat von Elvis:
btw:@Daniel
Mit ein wenig Stolz kann ich von mir behaupten, dem unwiderstehlichen Drang, dem großen H einen Einlauf zu verpassen, erfolgreich widerstanden zu haben
Das habe ich freudig zur Kenntnis genommen.
Daniel R. Wolf
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

 
Delphi 11 Alexandria
 
#24
  Alt 21. Mai 2006, 17:37
Zitat von Christian S.:
Aber irgendwann ist man aus dem Stadium heraus, dass man einen Compiler braucht, der einem Vorschriften macht, um lesbaren Code zu erzeugen.
Für mich hört sich das an, wie: Irgendwann kann man auch sauberen Code schreiben, ohne dass einem der Compiler dabei helfen muss ^^
Ronny
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock

 
Delphi 2010 Professional
 
#25
  Alt 21. Mai 2006, 17:55
Hallo SubData,

ja, die Aussage hört sich so an. Ich glaube nur einfach nicht daran. Die Disziplin wird in der Regel leider nur von sehr wenigen Programmierern eingehalten. Tools, die die Disziplin "fordern" -und dazu zählen auch Compiler- sind deshalb sinnvoll. Gute Programmierer werden häufig als Programmierer betrachtet, die schnell funktionierenden Code erstellen. Der Grad der Einhaltung von Regeln wird dabei häufig nur am Rand betrachtet.

Von daher ist ein Blick über den Tellerrand ja durchaus angebracht. Man sollte aber wirklich die Vorteile und die Nachteile auch gerade bezüglich der Wartbarkeit des entstehenden Codes sorgfältig gegeneinander abwägen. Sollte nach einem solchen Prozess die Vorteile z.B. von Chrome überwiegen, dann sollte man sich dafür entscheiden, sonst dagegen. Ein Blick über den Tellerrand hat sich dann in jedem Fall gelohnt, entweder zur Bestätigung des bisherigen Tools, oder aber zur Auswahl eines neuen.
Albert
  Mit Zitat antworten Zitat
Daniel G
 
#26
  Alt 21. Mai 2006, 18:05
Zitat von MrSpock:
Gute Programmierer werden häufig als Programmierer betrachtet, die schnell funktionierenden Code erstellen.
Dann bleibe ich lieber ein "schlechter Programmierer", wenn im Gegenzug die Leute kapieren, was ich mir da zusammengeschrieben habe.
Bilde ich mir das eigentlich nur ein, oder ist die Chrome - IDE deutlich günstiger als die Delphi - IDE? (um jetzt mal auf einen ökonomischen Punkt zu kommen... )
  Mit Zitat antworten Zitat
Elvis

 
Delphi 2010 Professional
 
#27
  Alt 21. Mai 2006, 18:10
Zitat von Daniel G:
Bilde ich mir das eigentlich nur ein, oder ist die Chrome - IDE deutlich günstiger als die Delphi - IDE? (um jetzt mal auf einen ökonomischen Punkt zu kommen... )
Wo hast du eine Chrome IDE gesehen?
Chrome selbst kostet für Ex-(.Net-)Delphianer 150€, dazu kommt noch ein VS05 Standard mit nochmal 300€ (keine Express, da die keine AddIns laden können).
Chrome ist also eine weitere Sprache im VS, es hat keine IDE.
Robert Giesecke
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 11 Alexandria
 
#28
  Alt 21. Mai 2006, 18:11
Zitat:
Bilde ich mir das eigentlich nur ein, oder ist die Chrome - IDE deutlich günstiger als die Delphi - IDE? (um jetzt mal auf einen ökonomischen Punkt zu kommen... Zwinkern )
Die CLI-Edition kosten sogar nix. Aber da Chrome keine eigene IDE hat muß man hier noch die KKosten von VS2005 hinzurechnen. Mit der express löüft Chrome nicht. (zumindest nicht die Trial-Version)
Markus Kinzler
  Mit Zitat antworten Zitat
Elvis

 
Delphi 2010 Professional
 
#29
  Alt 21. Mai 2006, 18:17
Zitat von mkinzler:
Zitat:
Bilde ich mir das eigentlich nur ein, oder ist die Chrome - IDE deutlich günstiger als die Delphi - IDE? (um jetzt mal auf einen ökonomischen Punkt zu kommen... Zwinkern )
Die CLI-Edition kosten sogar nix.
Dürfen auch nix kosten. Sonst würden einige mit ihren ASPX Spieereien große Probleme kriegen.
Der IIS/Cassini/Apache braucht schon einen CodeDOM/Compiler um Codebehind und inline Code verweben zu können. (Wobei man das auch statisch kompiliert lösen kann/sollte)

Deshalb sieht man bei Delphi.Net ASPX-Dateien language="C#"
Robert Giesecke
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.
 
#30
  Alt 21. Mai 2006, 18:26
Zitat von MrSpock:
ja, die Aussage hört sich so an. Ich glaube nur einfach nicht daran. Die Disziplin wird in der Regel leider nur von sehr wenigen Programmierern eingehalten.
Da ich als Hobby-Programmierer meist alleine arbeite, ist das ein Punkt, der für mich kaum von Belang ist, weil ich weiß, dass ich die Disziplin habe. Plant man die Anschaffung eines Compilers für eine große Gruppe (z.B. in einer Firma), ist das sicherlich ein Punkt, den man bedenken muss. (Unabhängig davon, wie meine Einschätzung davon ist, das ist auch nicht so wichtig.)

Zitat von MrSpock:
Von daher ist ein Blick über den Tellerrand ja durchaus angebracht. Man sollte aber wirklich die Vorteile und die Nachteile auch gerade bezüglich der Wartbarkeit des entstehenden Codes sorgfältig gegeneinander abwägen. Sollte nach einem solchen Prozess die Vorteile z.B. von Chrome überwiegen, dann sollte man sich dafür entscheiden, sonst dagegen. Ein Blick über den Tellerrand hat sich dann in jedem Fall gelohnt, entweder zur Bestätigung des bisherigen Tools, oder aber zur Auswahl eines neuen.


@Preis für IDE: Insgesamt kommt man aber immer noch deutlich günstiger weg als bei Delphi. Man hat zwar dann auch die anderen Delphi-Personalities nicht, dafür sind andere Dinge mit im Paket. Muss man halt schauen, was man braucht
Christian S.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 7     123 45     Letzte »    


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 22:12 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