diff --git a/lectures/9-comments/9-comments.md b/lectures/9-comments/9-comments.md new file mode 100644 index 0000000..b94d273 --- /dev/null +++ b/lectures/9-comments/9-comments.md @@ -0,0 +1,37 @@ +# კომენტარები + +განვიხილოთ `SteepleChase`-ის ამოცანა, როდესაც კარელი ღობეებს ახტებოდა. ამ შემთხვევაში განვიხილოთ ზუსტად იგივე კოდი, ოღონდ კომენტარებით. `SteepleChaseWithComments.java` ფაილში იდენტური კოდია, რაც მეორე ფაილში. უბრალოდ აქ დამატებულია ტექსტები, რასაც ვუწოდებთ კომენტარებს. სხვა სიტყვებით, კომენტარები არის ადამიანისთვის გასაგებ ენაზე დაწერილი ტექსტი, რომელსაც პროგრამა ყურადღებას არ აქცევს. ეს ტექსტები ადამიანს ეხმარება იმის გასააზრებლად, თუ რას აკეთებს პროგრამა. გარდა იმისა, რომ პროგრამა უნდა გაეშვას და იმუშაოს, აგრეთვე, პროგრამა იმიტომ იწერება, რომ ის ვიღაცამ უნდა შეცვალოს, გააუმჯობესოს და ახალი თვისებები დაამატოს. თუ ეს არ ხდება, ესე იგი ეს პროგრამა არ ვითარდება, არ იცვლება და არავის არ სჭირდება. ანუ პროგრამა იმისთვის იწერება, რომ ადრე თუ გვიან მასში ცვლილებები შევიდეს და მნიშვნელოვანია, რომ შეგვეძლოს მასში ცვლილებები მარტივად შევიტანოთ. სწორედ კომენტარები გვეხმარება ამ მიზნის მიღწევაში და ისინი საშუალებას გვაძლევს, რომ ჩვენ ან ჩვენი გუნდის წევრებმა მარტივად გაიგონ, თუ რას აკეთებს პროგრამა. + +## როგორ იწერება კომენტარები? + +ორნაირი კომენტარის დაწერა შეგვიძლია: + +```java +/* +* To run a race that is 9 avenues long, we need to move forward or jump hurdles +* 8 times. +*/ + +// Karel runs a steeple chase the is 9 avenues long. +``` + +პირველ შემთხვევაში (`/* */`), სიმბოლოებს შორის რაც ტექსტიც უნდა ეწეროს, პროგრამა მას არ შეხედავს და მასში არსებულ ნებისმიერ ტექსტს კომპიუტერი არც კი განიხილავს. თითოეულ ხაზზე არ არის აუცილებელი `*`-ები ეწეროს, მხოლოდ საწყის და ბოლო ხაზებზეა აუცილებელი ფიფქები (კომენტარის დასაწყისი და დასარული). მეორე შემთხვევაში არსებული სიმბოლოები `//`, საშუალებას გვაძლევს, კომენტარი დავწეროთ მხოლოდ ერთ ხაზზე, მის ქვევით ან ზევით რაც ეწერება ის არ იქნება დაკომენტარებული. + +## რა უნდა დავწეროთ კომენტარებში? + +პირველ რიგში ყველა ფაილის დასაწყისში, კომენტარების სახით გვიწერია ფაილის დასახელება, ავტორი და რას აკეთებს აქ დაწერილი პროგრამა. თითოეულ მეთოდს, როგორც წესი, მის დასაწყისში აქვს თავისი კომენტარი, იმისათვის რომ ავხსნათ, თუ ეს კონკრეტული მეთოდი რას აკეთებს. ადამიანმა რომ უკეთ გაიგოს, თუ რას აკეთებს მეთოდი, კარგი აზრია, რომ კომენტრარებში დავწეროთ, როგორი იყო სამყარო ამ მეთოდის გამოძახებამდე და როგორი გახდება მის შემდგომ. ასეთი მიდგომა ძალიან კარგად აღწერს, თუ რას აკეთებს მეთოდი. სხვა სიტყვებით, ამას ჰქვია `Pre-condition` და `Post-condition`. `Pre-condition`-ში უნდა ეწეროს, როგორი უნდა იყოს სამყარო იმისათვის, რომ ეს მეთოდი გამოვიძახოთ, ხოლო `Post-condition`-ში როგორი იქნება სამყარო მეთოდის დამთავრების შემდგომ. ამ ორი კომპონენტის დაწერის შემდგომ, ფაქტობრივად უკვე განსაზღვრულია, თუ რას წარმოადგენს არსებული მეთოდი და რა მოვალეობა აკისრია მას. მაგალითად: + +```java +/* + * Pre-condition: Facing East at bottom of hurdle + * Post-condition: Facing East at bottom in next avenue after hurdle +*/ +private void jumpHurdle() { + ascendHurdle(); + move(); + descendHurdle(); +} +``` + +`jumpHurdle` მეთოდის `Pre-condition` არის, რომ კარელი დგას ღობის წინ და იყურება აღმოსავლეთით, ხოლო `Post-condition` - კარელი დგას ღობის შემდეგ და იყურება კვლავ აღმოსავლეთით. ამით კი უკვე გასაგებია, რას აკეთებს ეს მეთოდი, ანუ უნდა გადაიყვანოს კარელი ღობის მეორე მხარეს. +როგორც წესი, ეს ორი დეტალი `Pre-condition` და `Post-condition` საკმარისია, რომ განვსაზღვროთ მეთოდი, თუმცა ხანდახან არის შემთხვევები, როდესაც ისეთი ალგორითმით არის გადაჭრილი პრობლემა, რაც ტრივიალური და მარტივი გასაგები არ არის. ასეთი ალგორითმი ჯობია აღვწეროთ ხოლმე კომენატრის სახით, რათა სხვა ადამიანმა მარტივად გაიაზროს. დავალებაში არსებულ მეთოდებსაც აუცილებლად უნდა ჰქონდეს კომენტარები. diff --git a/lectures/9-comments/SteepleChaseWithComments.java b/lectures/9-comments/SteepleChaseWithComments.java new file mode 100644 index 0000000..d97f8d6 --- /dev/null +++ b/lectures/9-comments/SteepleChaseWithComments.java @@ -0,0 +1,66 @@ +/* +* File: SteepleChase.java +* ----------------------- +* Karel runs a steeple chase the is 9 avenues long. +* Hurdles are of arbitrary height and placement. +*/ +import stanford.karel.*; + +public class SteepleChaseWithComments extends SuperKarel { + /* + * To run a race that is 9 avenues long, we need to move forward or jump hurdles + * 8 times. + */ + public void run() { + for (int i = 0; i < 8; i++) { + if (frontIsClear()) { + move(); + } else { + jumpHurdle(); + } + } + } + + /* + * Pre-condition: Facing East at bottom of hurdle + * Post-condition: Facing East at bottom in next avenue after hurdle + */ + private void jumpHurdle() { + ascendHurdle(); + move(); + descendHurdle(); + } + + /* + * Pre-condition: Facing East at bottom of hurdle + * Post-condition: Facing East immediately above hurdle + */ + private void ascendHurdle() { + turnLeft(); + while (rightIsBlocked()) { + move(); + } + turnRight(); + } + + /* + * Pre-condition: Facing East above and immediately after hurdle + * Post-condition: Facing East at bottom of hurdle + */ + private void descendHurdle() { + turnRight(); + moveToWall(); + turnLeft(); + } + + /* + * Pre-condition: none + *Post-condition: Facing first wall in whichever direction Karel was facing previously + */ + private void moveToWall() { + while (frontIsClear()) { + move(); + } + } +} + diff --git a/lectures/9-comments/SteepleChaseWithoutComments.java b/lectures/9-comments/SteepleChaseWithoutComments.java new file mode 100644 index 0000000..c60d69b --- /dev/null +++ b/lectures/9-comments/SteepleChaseWithoutComments.java @@ -0,0 +1,42 @@ +import stanford.karel.*; + +public class SteepleChaseWithoutComments extends SuperKarel { + + public void run() { + for (int i = 0; i < 8; i++) { + if (frontIsClear()) { + move(); + } else { + jumpHurdle(); + } + } + } + + private void jumpHurdle() { + ascendHurdle(); + move(); + descendHurdle(); + } + + private void ascendHurdle() { + turnLeft(); + while (rightIsBlocked()) { + move(); + } + turnRight(); + } + + private void descendHurdle() { + turnRight(); + moveToWall(); + turnLeft(); + } + + private void moveToWall() { + while (frontIsClear()) { + move(); + } + } + +} +