Frage

Ich unterrichte / helfen Student zu programmieren.

Ich erinnere mich, der folgende Prozess hat mir immer geholfen, als ich anfing; Es sieht ziemlich intuitiv und ich frage mich, wenn jemand anderes einen ähnlichen Ansatz gehabt hat.

  1. Lesen Sie das Problem und versteht es (natürlich).
  2. Identifizieren möglich "Funktionen" und Variablen.
  3. Schreiben Sie wie würde ich es Schritt (Algorithmus)
  4. Schritt tun
  5. Übersetzen es in den Code, wenn es etwas, das Sie nicht tun können, erstellen Sie eine Funktion, die es für Sie tut und in Bewegung bleiben.

Mit der Zeit und Praxis, die ich vergessen zu haben scheinen, wie schwer es war, von der Problembeschreibung an eine Kodierungslösung passieren, aber durch die Anwendung dieser Methode ich es geschafft, zu lernen, wie man programmiert.

Also für eine Projektbeschreibung wie:

  

hat ein System den Preis eines Artikels berechnen auf den folgenden Regeln (eine Beschreibung der Regeln ... Client, Rabatte, Verfügbarkeit etc .. etc.etc.)

mir erster Schritt ist, zu verstehen, was das Problem ist.

Dann das Element identifizieren, die Regeln der Variablen etc.

Pseudo-Code so etwas wie:

function getPrice( itemPrice, quantity , clientAge, hourOfDay ) : int 
   if( hourOfDay > 18 ) then
      discount = 5%

   if( quantity > 10 ) then
      discount = 5%

   if( clientAge > 60 or < 18 ) then
      discount = 5%


        return item_price - discounts...
end

Und dann gibt sie an die Programmiersprache ..

public class Problem1{
    public int getPrice( int itemPrice, int quantity,hourOdDay ) {
        int discount = 0;
        if( hourOfDay > 10 ) {
             // uh uh.. U don't know how to calculate percentage... 
             // create a function and move on.
            discount += percentOf( 5, itemPriece );
            .
            .
            .
            you get the idea..

        }
     }
    public int percentOf( int percent, int i ) {
             // .... 
    }


}

Haben Sie auf einem ähnlichen Ansatz ging? .. Hat jemand beibringen, einen ähnlichen Ansatz oder haben Sie Ihre selbst entdeckt (wie ich :( tat)

War es hilfreich?

Lösung

Ich habe etwas ähnliches.

  • Abbildung die Regeln / Logik aus.
  • die Mathematik Herauszufinden.
  • Dann versuchen und Code es.

Danach Monate für ein paar tun es wird nur verinnerlicht. Sie erkennen nicht, Ihr es zu tun, bis Sie gegen ein komplexes Problem kommen, die Sie erfordert es zu brechen.

Andere Tipps

Ich gehe über den Testorientierten Ansatz.

1. Ich schreibe (auf Papier oder Texteditor) eine Liste von Tests oder Spezifikation, die die Bedürfnisse des Problems genügen würde.

- simple calculations (no discounts and concessions) with:
    - single item
    - two items
    - maximum number of items that doesn't have a discount
- calculate for discounts based on number of items
    - buying 10 items gives you a 5% discount
    - buying 15 items gives you a 7% discount
    - etc.
- calculate based on hourly rates
    - calculate morning rates
    - calculate afternoon rates
    - calculate evening rates
    - calculate midnight rates
- calculate based on buyer's age
    - children
    - adults
    - seniors
- calculate based on combinations
    - buying 10 items in the afternoon

2. Achten Sie auf die Elemente, die ich denke, würde das am einfachsten zu implementieren und einen Test für sie zu schreiben. Z. B Einzelstücke sehen einfach

Die Probe mit Nunit und C #.

[Test] public void SingleItems()
{
    Assert.AreEqual(5, GetPrice(5, 1));
}

implementieren, mit:

public decimal GetPrice(decimal amount, int quantity)
{
    return amount * quantity; // easy!
}

Dann auf die beiden Elemente bewegen.

[Test]
public void TwoItemsItems()
{
    Assert.AreEqual(10, GetPrice(5, 2));
}

Die Umsetzung verläuft nach wie vor dem Test so weiter auf den nächsten Test bewegen.

3. Seien Sie immer auf der Suche für die Vervielfältigung und entfernen. Sie sind fertig, wenn alle Tests bestanden und Sie können jeden Test nicht mehr denken.

Dies garantiert nicht, dass Sie den effizientesten Algorithmus schaffen werden, aber so lange, wie Sie wissen, was zu testen und alle Pässe, es wird garantieren, dass Sie die richtigen Antworten bekommen.

die alte Schule OO Art und Weise:

  • aufschreiben eine Beschreibung des Problems und seiner Lösung
  • umkreisen die Substantive, sind diese Kandidatenobjekte
  • ziehen Kästchen um die Verben, sind diese Kandidaten Nachrichten
  • Gruppe der Verben mit den Substantiven, die die Aktion ‚tun‘ würden; Sie alle anderen Substantive, die helfen, die erforderlich wäre,
  • Sie, ob Sie die Lösung mit dem Formular noun.verb (andere Substantive) Berichtigen können
  • Code it

[diese Methode vorausgeht CRC-Karten, aber es ist schon so lange (über 20 Jahre), dass ich mich nicht erinnern, wo ich es gelernt]

, wenn die Programmierung Lernen Ich glaube nicht, TDD hilfreich. TDD ist gut später, wenn Sie haben eine Vorstellung von dem, was die Programmierung über, aber für den Anfang, eine Umgebung, mit dem Sie Code schreiben und die Ergebnisse in der schnellstmöglichen Zeit umdrehen sehen, ist das Wichtigste.

Ich würde aus Problemstellung gehen sofort zu codieren. Hack es um. Hilfe die Schüler verschiedene Arten von Komponieren Software / Strukturierung Algorithmen sehen. Lehren die Schüler ihre Meinung zu ändern und überarbeiten Sie den Code. Versuchen Sie, und ein wenig über Code Ästhetik lehren.

Sobald sie um Code zu hacken .... dann einzuführen, um die Idee der formalen Umstrukturierung in Bezug auf dem Refactoring. Dann führt die Idee von TDD als eine Möglichkeit, den Prozess ein bisschen robuster zu machen. Aber nur, wenn sie sich sicher fühlen Code in die Manipulation zu tun, was sie wollen. Die Möglichkeit, Tests zu spezifizieren ist dann etwas leichter zu diesem Zeitpunkt. Der Grund dafür ist, dass TDD über Design. Wenn Sie lernen, wirklich nicht so viel über Design kümmern, sondern über das, was Sie tun können, was für Spielzeug zu tun haben, die Sie zu spielen, wie sie funktionieren, wie man sie zusammen kombinieren kann. Sobald Sie ein Gefühl für das haben, dann möchten Sie über Design und das ist zu denken, wenn TDD wirklich anspringt.

Von dort würde ich Mikro-Muster führt in Design Patterns starten Einführung

ich an der Spitze beginnen und unten meine Art und Weise arbeiten. Grundsätzlich werde ich durch das Schreiben ein hohes Maß Verfahren beginnen, skizzieren die Details im Inneren davon, und dann in den Details beginnen zu füllen.

Sagen, dass ich dieses Problem hatte (yoinked von Project Euler)

  

Die Summe der Quadrate der ersten   zehn natürliche Zahlen sind, 1 + 2 ^ 2 ^ 2 +   ... + 10 ^ 2 = 385

     

Das Quadrat der Summe der ersten zehn   natürliche Zahlen, (1 + 2 + ... +   10) ^ 2 = 55 ^ 2 = 3025

     

Daraus ergibt sich die Differenz zwischen der Summe   der Quadrate der ersten zehn   natürliche Zahlen und das Quadrat der   Summe 3025 385 = 2640.

     

Den Unterschied zwischen der Summe der   Die Quadrate der ersten hundert   natürliche Zahlen und das Quadrat der   Summe.

So ich so beginnen:

(display (- (sum-of-squares (list-to 10))
            (square-of-sums (list-to 10))))

Nun, in Schema gibt es keine Summe der Quadrate, quadratisch-of-Summen oder Liste zu Funktionen. Der nächste Schritt wäre jeder von denen, zu bauen. In jeder dieser Funktionen bauen, kann ich finde ich abstrahieren müssen Sie mehr. Ich versuche, die Dinge einfach zu halten, so dass jede Funktion wirklich nur eine Sache tut. Wenn ich einige Stück Funktionalität bauen, die prüfbar ist, schreibe ich einen Unit-Test für sie. Wenn ich beginne eine logische Gruppierung für einige Daten zu bemerken, und die Funktionen, die auf sie einwirken, ich es in ein Objekt schieben kann.

Ich habe TDD alle genossen, da es mir vorgestellt wurde. Hilft ich meinen Code planen, und es bringt mich einfach wohl mit allen meinen Tests zurückkehren mit „Erfolg“ jedes Mal, wenn ich meinen Code ändern, dass ich weiß, ich werde pünktlich zu Hause heute!

Wunschdenken ist wahrscheinlich das wichtigste Werkzeug, um komplexe Probleme zu lösen. Im Zweifelsfall davon ausgehen, dass eine Funktion, Ihr Problem zu lösen besteht (Erstellen eine Stummel, zunächst). Sie werden später darauf zurückkommen es zu erweitern.

Ein gutes Buch für Anfänger für einen Prozess der Suche: Test Driven Development: Mit dem Beispiel

Mein Vater hatte ein paar Flussdiagramm Schablonen, die er verwendet, um mich zu verwenden, wenn er mich zum ersten Mal über die Programmierung unterrichtet wurde. Ich bis heute zeichnen Quadrate und Diamanten einen logischen Prozess, wie zu bauen, ein Problem zu analysieren.

Ich denke, es über ein Dutzend verschiedene Heuristiken ich kenne, wenn es um Programmierung geht und so neige ich dazu, manchmal durch die Liste gehen mit dem, was ich zu tun bin versucht. Zu Beginn ist es wichtig zu wissen, was das Endergebnis gewünscht ist und dann versuchen, nach hinten zu arbeiten, um es zu finden.

Ich erinnere mich an eine Algorithmen-Klasse einige dieser Möglichkeiten, wie Abdeckung:

  • Reduzieren Sie es auf ein bekanntes Problem oder triviales Problem
  • Teile und herrsche (MergeSort ein klassisches Beispiel, hier zu sein)
  • Verwenden Sie Datenstrukturen, die die richtigen Funktionen (HeapSort ist hier ein Beispiel)
  • haben
  • Rekursion (Wissen trivial Lösungen und in der Lage, diejenigen zu reduzieren)
  • Dynamische Programmierung

eine Lösung Organisation sowie für ungeradee Situationen zu testen, zum Beispiel wenn jemand denkt, soll L eine Zahl sein, ist das, was ich würde in der Regel die Idee, in Pseudo-Code zu testen, verwenden, bevor es das Schreiben auf.

Entwurfsmuster können ein handliches Set von Werkzeugen seines für bestimmte Fälle zu verwenden, wie in dem ein Adapter benötigt wird, oder die Dinge in einen Zustand oder eine Strategie Lösung zu organisieren.

Ja .. gut TDD did't existiert (oder war nicht so populär), als ich anfing. Würde die Art und Weise TDD werden, um von der Problembeschreibung passieren zu kodieren? ... Ist das nicht ein wenig fortgeschritten? Ich meine, wenn ein „Zukunft“ Entwickler kaum verstehen, was eine Programmiersprache ist, wäre es nicht kontraproduktiv sein?

Was ist hamcrest die den Übergang von dem Algorithmus, um Code zu machen.

Ich denke, es gibt einen besseren Weg, um Ihr Problem zu erklären.

anstatt es als ‚System‘, zu definieren, definieren, was in Bezug auf den Benutzereingaben und Ausgaben zu erwarten ist.

„An einem Fenster, soll ein Benutzer ein Element aus einer Liste auswählen, und eine Box sollte ihm zeigen, wie viel es kostet.“

Dann können Sie ihn einige der Faktoren geben, die Kosten zu bestimmen, einschließlich Musterstücke und was ihre Kosten sollten am Ende wird.

(dies ist auch sehr viel eine TDD-ähnliche Idee)

Beachten Sie, wenn Sie 5% steigen dann weitere 5% ab, bekommt man nicht 10%. Vielmehr zahlen Sie 95% von 95%, was 90,25% beträgt, oder 9,75% ab. Also, sollten Sie den Prozentsatz nicht hinzugefügt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top