Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
sap_enthusiast
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
sap_enthusiast
skynet is on the rise :/DeathAndPain hat geschrieben: ↑25.01.2023 16:03Ich kann mir das nur so erklären, dass er aus dem vorausgegangenen Gespräch (in dem ich halt mit den verschiedensten Fragen abgeklopft habe, was er so drauf hat) den Schluss gezogen hat, für mich keinen Code erzeugen zu wollen. Die genauen Zusammenhänge sind mir aber unklar.
So schnell wirst du nicht ersetzt. Da Problem beim Programmieren für Anwender ( also SAP ) ist nicht das Umsetzen eines Algorithmus in Code sondern die davor notwendigen Schritte. U.a. "Umsetzen der Anforderung in einen brauchbaren Algorithmus" und - wohl noch viel wichtiger - "Erkennen was der User wirklich braucht." Was weder das sein muss was er gerne hätte noch das, wovon er behauptet es zu benötigen"sap_enthusiast hat geschrieben: ↑26.01.2023 09:13Ich schwanke zwischen ich werde in einigen Jahren ersetzt und hey es könnte ein gutes tool für die Generierung von 0815 Typ code sein um mir Zeit zu sparen.
Da gebe ich dir Recht. Als SAPler haben wir den Vorteil dass unser Wissen schon einigermaßen gehütet wird, sprich ABAP ist ja nicht so verbreitet wie manch andere Technologien. Wenn ich darüber nachdenke, ein Ersetzungsrisiko sehe ich vor allem bei den sehr verbreiteten Sprachen wie JS oder Python aber da gilt weiterhin dein Punkt. Den Kerninhalt einer Anforderung zu verstehen braucht es mehr als KI.black_adept hat geschrieben: ↑26.01.2023 15:40So schnell wirst du nicht ersetzt. Da Problem beim Programmieren für Anwender ( also SAP ) ist nicht das Umsetzen eines Algorithmus in Code sondern die davor notwendigen Schritte. U.a. "Umsetzen der Anforderung in einen brauchbaren Algorithmus" und - wohl noch viel wichtiger - "Erkennen was der User wirklich braucht." Was weder das sein muss was er gerne hätte noch das, wovon er behauptet es zu benötigen"
Ich schätze da braucht es noch mehr Zeit um so weit zu kommen. Bei Visual Studio wird Chat GPT demnächst integriert. Also bei anderen Sprachen wird es vlt demnächst im Stande sein, deutlich mehr liefern können.
Folgende Benutzer bedankten sich beim Autor deejey für den Beitrag (Insgesamt 2):
ewx • sap_enthusiast
Denke ich auch. Vieles an Wissen und Können wird mMn überschätzt. Gerade auch, weil man mit der KI in den Dialog treten kann. Wenn einem etwas nicht gefällt oder das Ergebnis nicht passt, dann bittet man es um Korrektur.DeathAndPain hat geschrieben: ↑26.01.2023 19:34Ehrlich gesagt traue ich einem weiterentwickelten ChatGPT durchaus zu, praktische Anforderungen zu erkennen.
Code: Alles auswählen.
CLASS zprices_1 DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
METHODS calculate_lift_pass_price IMPORTING
i_type TYPE char10
i_age TYPE int4 OPTIONAL
RETURNING VALUE(r_cost) TYPE int4.
PRIVATE SECTION.
CLASS-METHODS calculate_discount
IMPORTING
i_age TYPE int4
RETURNING VALUE(r_discount) TYPE f.
CLASS-DATA:
c_discount_night TYPE f VALUE '0.4',
c_discount_kids TYPE f VALUE '0.3',
c_discount_senior TYPE f VALUE '0.25'.
INTERFACES if_pricing_dao.
DATA:
m_dao TYPE REF TO if_pricing_dao.
ENDCLASS.
CLASS zprices_1 IMPLEMENTATION.
CONSTRUCTOR.
CREATE OBJECT base_prices_dao TYPE zbase_prices_dao.
ENDMETHOD.
METHOD calculate_lift_pass_price.
DATA:
l_base_price TYPE int4.
m_dao->get_base_price( EXPORTING i_type = i_type IMPORTING e_base_price = l_base_price ).
IF l_base_price IS INITIAL.
r_cost = 0.
ELSE.
r_cost = CEIL( l_base_price * ( 1 - calculate_discount( i_age ) ) ).
ENDIF.
ENDMETHOD.
CLASS-METHOD calculate_discount.
IF i_age < 6.
r_discount = 0.
ELSEIF i_age < 15.
r_discount = c_discount_kids.
ELSEIF i_age > 64.
r_discount = c_discount_senior.
ELSEIF i_type = 'night'.
r_discount = c_discount_night.
ELSE.
r_discount = 0.
ENDIF.
ENDMETHOD.
ENDCLASS.
INTERFACE if_pricing_dao.
METHODS get_base_price
IMPORTING
i_type TYPE char10
EXPORTING
e_base_price TYPE int4.
ENDINTERFACE.
CLASS zbase_prices_dao DEFINITION IMPLEMENTING if_pricing_dao.
METHOD if_pricing_dao~get_base_price.
SELECT SINGLE cost INTO e_base_price
FROM zbase_prices
WHERE type = i_type.
ENDMETHOD.
ENDCLASS.
Ich habe dann noch darum gebeten, Testfälle für den ursprünglichen Code zu schreiben. Gemischt mit allgemeinem Blabla kamen aus meiner Sicht gute Hinweise:ChatGPT hat geschrieben:Ich habe versucht die Logik im Code durch Umstrukturieren der If-Then-Else-Abfragen und der Verwendung von Variablen mit sinnvollen Namen zu verbessern. Dies beinhaltet das Entfernen unnötiger Verzweigungen und die Verwendung von Schleifen, um wiederholte Berechnungen zu vereinfachen. Ich habe auch versucht, unnötige Datentypumwandlungen zu entfernen und die Verwendung von Konstanten anstelle von harten Codierungen zu verbessern. Darüber hinaus habe ich versucht, die Logik durch die Schaffung einer Klasse "DAO" (Data Access Object) und die Verwendung von Dependency Injection zu modularisieren und die Wartbarkeit des Codes zu verbessern. Ich habe auch versucht das Interface dafür zu erstellen und ungenutzte Variablen zu entfernen.
Ich bat dann:ChatGPT hat geschrieben:Um sinnvolle und ausreichende Unit-Tests für den ursprünglichen Code zu schreiben, könnten wir folgende Schritte ausführen:
1. Wir definieren Testfälle für die Methode calculate_lift_pass_price basierend auf verschiedenen Alterwerten und Typen von Liftpassen. Beispielsweise könnten wir einen Testfall erstellen, bei dem das Alter auf 5 gesetzt ist und der Typ auf "tag" gesetzt ist. Wir erwarten, dass der Preis 0 ist.
2. Wir implementieren eine Methode setup in unserer Testklasse, die die Testdaten in die Datenbank einfügt.
3. Wir implementieren die eigentlichen Testmethoden, die die Methode calculate_lift_pass_price aufrufen und die Ergebnisse mit den erwarteten Werten vergleichen.
4. Wir führen die Unit-Tests aus und überprüfen, ob alle Tests erfolgreich sind.
5. Wir können auch die Testbedingungen erweitern, um die Grenzwerte der Eingabeparameter abzudecken und sicherzustellen, dass der Code auch in diesen Fällen korrekt arbeitet.
6. Wir können auch die Testbedingungen erweitern, um die Fehlerbehandlung des Codes zu testen, indem wir ungültige Eingabeparameter verwenden.
7. Wir können auch die Testbedingungen erweitern, um die Leistung des Codes zu testen und sicherzustellen, dass er für große Mengen an Daten skaliert.
8. Wir können auch die Testbedingungen erweitern, um die Sicherheit des Codes zu testen, indem wir sicherstellen, dass der Code gegen Eingabeaufforderungen (SQL-Injection, XSS) geschützt ist.[/list]
Die Antwort:Enno hat geschrieben:liste auf, welche kombinationen aus Tageszeit und alter sinnvoll sind und welche Ergebnisse zu erwarten sind
Damit ich die Unit tests nicht selbst schreiben muss:ChatGPT hat geschrieben:Tageszeit "Tag":
Alter < 6: Erwartetes Ergebnis: 0
Alter < 15: Erwartetes Ergebnis: Basispreis mit 30% Rabatt
Alter > 64: Erwartetes Ergebnis: Basispreis mit 25% Rabatt
Kein Alter angegeben: Erwartetes Ergebnis: Basispreis
Tageszeit "Nacht":
Alter >= 6: Erwartetes Ergebnis: Basispreis mit 40% Rabatt
Alter < 6: Erwartetes Ergebnis: 0
Es kann sinnvoll sein, weitere Altersgruppen (z.B. 15-64) und verschiedene Basispreise für unterschiedliche Lifttypen hinzuzufügen, um die Tests zu erweitern und die Genauigkeit der Ergebnisse zu prüfen.
ChatGPT hat dann, wie in vorherigen Versuchen den Aufruf von ASSERT_EQUALS nicht korrekt gemacht:Enno hat geschrieben:Schreibe für diese Liste unit tests in ABAP
Code: Alles auswählen.
cl_abap_unit_assert=>assert_equals( expected_cost, actual_cost ).
Code: Alles auswählen.
ASSERT_EQUALS( expected = expected_cost actual = cost message = 'Test for night pass and age greater than 64 failed' ).
Code: Alles auswählen.
CLASS lcl_zprices_1 DEFINITION FOR TESTING DURATION SHORT.
PRIVATE SECTION.
DATA: lv_dao TYPE REF TO zprices_1_dao.
METHODS setup.
METHODS teardown.
METHODS test_calculate_lift_pass_price_day_under_6.
METHODS test_calculate_lift_pass_price_day_6_to_15.
METHODS test_calculate_lift_pass_price_day_over_15.
METHODS test_calculate_lift_pass_price_night_under_6.
METHODS test_calculate_lift_pass_price_night_6_to_64.
METHODS test_calculate_lift_pass_price_night_over_64.
ENDCLASS.
CLASS lcl_zprices_1 IMPLEMENTATION.
METHOD setup.
CREATE OBJECT lv_dao TYPE zprices_1_dao.
lv_dao->set_base_price( 'day', 100 ).
lv_dao->set_base_price( 'night', 80 ).
ENDMETHOD.
METHOD teardown.
ENDMETHOD.
METHOD test_calculate_lift_pass_price_day_under_6.
DATA(lv_cost) = lv_dao->calculate_lift_pass_price( age = 5, type = 'day' ).
cl_abap_unit_assert=>assert_equals( expected = 0, actual = lv_cost msg = 'Price for day ticket under 6 years should be 0' ).
ENDMETHOD.
METHOD test_calculate_lift_pass_price_day_6_to_15.
DATA(lv_cost) = lv_dao->calculate_lift_pass_price( age = 10, type = 'day' ).
cl_abap_unit_assert=>assert_equals( expected = 70, actual = lv_cost msg = 'Price for day ticket between 6 and 15 years should be 30% off' ).
ENDMETHOD.
METHOD test_calculate_lift_pass_price_day_over_15.
DATA(lv_cost) = lv_dao->calculate_lift_pass_price( age = 20, type = 'day' ).
cl_abap_unit_assert=>assert_equals( expected = 100, actual = lv_cost msg = 'Price for day ticket over 15 years should be full price' ).
DATA(lv_cost) = lv_dao->calculate_lift_pass_price( age = 65, type = 'day' ).
cl_abap_unit_assert=>assert_equals( expected = 75, actual = lv_cost msg = 'Price for day ticket over 64 years should be 25% off' ).
ENDMETHOD.
Code: Alles auswählen.
Code: Alles auswählen.
IF type NE 'night'.
/* Wenn der Lifttyp nicht "night" ist, dann wird der Preis in Abhängigkeit des Alters berechnet. */
IF age IS SUPPLIED AND age < 15.
/* Wenn das Alter mitgeliefert wurde und kleiner als 15 ist, erhält die Person einen Rabatt von 30% */
DATA(ld_cost_3) = CONV f( ld_baseprice * ( 1 - 30 / 100 ) ).
cost = ceil( ld_cost_3 ).
ELSE.
IF age IS NOT SUPPLIED.
cost = ceil( ld_baseprice ).
ELSE.
/* Wenn das Alter mitgeliefert wurde und größer oder gleich 15 ist und kleiner als 65, erhält die Person keinen Rabatt*/
IF age > 64.
/* Wenn das Alter mitgeliefert wurde und größer oder gleich 65 ist, erhält die Person einen Rabatt von 25% */
DATA(ld_cost_4) = CONV f( ld_baseprice * ( 1 - 25 / 100 ) ).
cost = ceil( ld_cost_4 ).
ELSE.
cost = ceil( ld_baseprice ).
ENDIF.
ENDIF.
ENDIF.