Auffrischung der Programmiersprachenkenntnisse

Ich habe angefangen mich wieder in den Programmiersprachen zu trainieren, die ich mehr oder weniger gut kenne. Und lerne nebenbei eine neue Programmiersprache: Rust.

Da ich sehr viel Zeit in mein Studium investiere, bleibt mir keine Zeit für große und aufwendige Projekte. Aus diesem Grund habe ich begonnen, grundlegende Algorithmen in verschiedenen Programmiersprachen zu implementieren, um die syntaktischen Besonderheiten kennen zu lernen.

Gerade bei Rust muss ich mich an einige Besonderheiten gewöhnen. Begonnen habe ich mit Bubble Sort. Diesen Algorithmus werde ich in den Programmiersprachen Rust, Python, C und JavaScript entwickeln. Sowie auch die anderen Algorithmen, die ich mir aussuche. Möglicherweise werde ich dies auch auf Java und C# erweitern. C# werde ich dann wahrscheinlich mit MonoDevelop/Xamarin Studio entwickeln.

Die Algorithmen werde ich mit möglichst verständlichem Code, einfachen Funktionen, und hoffentlich auch Tests programmieren.
Sofern es mir die Programmiersprache erlaubt, werde ich idiomatischen Code schreiben. Ich werde, soweit ich die Motivation und die Zeit habe, den Code weiter optimieren.

Visual Studio Code und eigene TypeScript Definition Files

Vor kurzem bin ich über Visual Studio Code gestolpert und bin angenehm überrascht. Ich hätte nicht gedacht, dass Microsoft es wirklich schafft, die Annehmlichkeiten einer großen IDE in einen leichtgewichtigen Editor zu verpacken.

Nun habe ich begonnen VSCode auch im Alltag einzusetzen. Ich bin damit deutlich schneller unterwegs als mit Brackets. In den letzten Tagen habe ich meine Vertretungsplan-Webapp erweitert und wollte jetzt für meine Vertretungsplan-Bibliothek, die ich geschrieben habe, TypeScript Definition Files anlegen. Mit denen kann VSCode die IntelliSense-Dienste anbieten.

Nach einigem hin und her und ganz viel Gesuche habe ich endlich die Lösung des Rätsels gefunden. Und ich musste einen Fehler akzeptieren.
Das alte Resultat ist folgendes:

interface VP {
    new (webViewElementID: string): VP;
    prototype: VP;
     
    username: string;
    password: string;
    webView: string;
    classID: number;
    CW: number;
    genericPlanStart: string;
    genericTeacherPlanStart: string;
    classList: string[];
    teacherList: string[];
    roomList: string[];
    teacherMode: boolean;
     
    setType(type: string): void;
    navigate(): void;
    getCurrentCW(): number;
    retrieveClassList(): void;
    parseRawData(newRawData: string): void;
    parseTeacherRawData(newRawData: string): void;
    getClassList(listType: string): string[];
    setClassID(id: number): void;
    parseClassID(): string;
}
 
declare var Vertretungsplan: VP;
 
declare var classFavList: string[];
declare var classList: string[];
declare var isFaved: boolean; 
declare var isAlreadyFav: boolean;
declare var classID: number;
 
declare function refreshFavListSelector(): void;

Hier die d.ts-Datei für lose Typen-Definitionen:

declare var classFavList: string[];
declare var classList: string[];
declare var isFaved: boolean; 
declare var isAlreadyFav: boolean;
declare var classID: number;

declare function refreshFavListSelector(): void;
declare function getWeekNumber(): number;
declare class VertretungsplanTP {
    webView: string;
    classID: number;
    CW: number;
    currentType: string;
    genericPlanStart: string;
    genericTeacherPlanStart: string;
    bigPlanEnding: string;
    classList: string[];
    teacherList: string[];
    roomList: string[];
    teacherMode: boolean;
    username: string;
    password: string;
    constructor(webViewElementID: string);
    setType(type: string): void;
    navigate(): void;
    getCurrentCW(): number;
    retrieveClassList(): void;
    parseRawData(newRawData: any): void;
    parseTeacherRawData(newRawData: string): void;
    getClassList(listType: string): void;
    setClassID(id: number): void;
    parseClassID(): string;
}

Mit dieser Datei bot mir VSCode endlich IntelliSense-Dienste für meine Bibliothek an. Wenn man seine Bibliothek nicht gerade selber mit TypeScript schreibt und danach kompilieren lässt, dann ist das hier eine nützliche Methode, um IntelliSense-Unterstützung für eigene JS-Dateien zu bekommen.

Eventuell werde ich die Klasse in TypeScript neu implementieren, das ist aber grundsätzlich nicht nötig.


Nachtrag: Ich habe nun die Klasse in TypeScript neu implementiert und habe die Definitionen nun in zwei d.ts-Dateien aufgeteilt. Eine Definition beinhaltet lose Funktionen und Variablen innerhalb der App und die andere wird mit tsc generiert und beinhaltet die Deklarationen und Typen-Definitionen der Vetretungsplan-Klasse.