Skip to content

add lecture-9 #173

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions lectures/9-comments/9-comments.md
Original file line number Diff line number Diff line change
@@ -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` საკმარისია, რომ განვსაზღვროთ მეთოდი, თუმცა ხანდახან არის შემთხვევები, როდესაც ისეთი ალგორითმით არის გადაჭრილი პრობლემა, რაც ტრივიალური და მარტივი გასაგები არ არის. ასეთი ალგორითმი ჯობია აღვწეროთ ხოლმე კომენატრის სახით, რათა სხვა ადამიანმა მარტივად გაიაზროს. დავალებაში არსებულ მეთოდებსაც აუცილებლად უნდა ჰქონდეს კომენტარები.
66 changes: 66 additions & 0 deletions lectures/9-comments/SteepleChaseWithComments.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
}

42 changes: 42 additions & 0 deletions lectures/9-comments/SteepleChaseWithoutComments.java
Original file line number Diff line number Diff line change
@@ -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();
}
}

}