Skip to content

Commit 24f996e

Browse files
committed
final changes
1 parent 8015dd2 commit 24f996e

File tree

3 files changed

+20
-22
lines changed

3 files changed

+20
-22
lines changed

1-js/06-advanced-functions/09-call-apply-decorators/02-delay/task.md

+1-3
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@ importance: 5
44

55
# Διακοσμητής καθυστέρησης
66

7-
Create a decorator `delay(f, ms)` that delays each call of `f` by `ms` milliseconds.
8-
97
Δημιούργησε ένα διακοσμητή `delay(f, ms)` που καθυστερεί κάθε κλήση της `f` χρόνο ίσο με `ms` δέκατα του δευτερολέπτου.
108

11-
Για παράδειγμαω
9+
Για παράδειγμα:
1210

1311
```js
1412
function f(x) {

1-js/06-advanced-functions/09-call-apply-decorators/article.md

+17-17
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
Αν η συνάρτηση καλείται συχνά, ενδέχεται να θέλουμε να κάνουμε cache (θυμόμαστε) τα αποτελέσματα προκείμενου να μην χρειάζεται να δαπανήσουμε επιπλέον χρόνο σε επανυπολογισμούς.
1010

11-
Όμως, αντί να προσθέσουμε αυτή τη λειτουργικότητα στη `slow()` θα δημιουρήσουμε μια συνάρτηση "κάλυμμα", η οποία θα προσθέσει το caching. Όπως θα δούμε, υπάρχουν αρκετά πλεονεκτήματα σε αυτή τη μέθοδο.
11+
Όμως, αντί να προσθέσουμε αυτή τη λειτουργικότητα στη `slow()` θα δημιουρήσουμε μια συνάρτηση-κάλυμμα, η οποία θα προσθέσει το caching. Όπως θα δούμε, υπάρχουν αρκετά πλεονεκτήματα σε αυτή τη μέθοδο.
1212

1313
Αυτός είναι ο κώδικας, και οι επεξηγήσεις ακολουθούν:
1414

@@ -37,27 +37,27 @@ function cachingDecorator(func) {
3737
slow = cachingDecorator(slow);
3838

3939
alert( slow(1) ); // slow(1) είναι cached
40-
alert( "Again: " + slow(1) ); // το ίδιο
40+
alert( "Ξανά: " + slow(1) ); // το ίδιο
4141

4242
alert( slow(2) ); // slow(2) είναι cached
43-
alert( "Again: " + slow(2) ); // το ίδιο με τη προηγούμενη γραμμή
43+
alert( "Ξανά: " + slow(2) ); // το ίδιο με τη προηγούμενη γραμμή
4444
```
4545

46-
Στον από πάνω κώδικα, η `cachingDecorator` είναι ένας *διακοσμητής*, μια ειδική συνάρτηση η οποία παίρνει μια άλλη συνάρτηση και επηρεάζει την συμπεριφορά της.
46+
Στον από πάνω κώδικα, ο `cachingDecorator` είναι ένας *διακοσμητής*: μια ειδική συνάρτηση η οποία παίρνει μια άλλη συνάρτηση και επηρεάζει την συμπεριφορά της.
4747

48-
Η ιδέα είναι ότι μπορούμε να καλέσουμε την `cachingDecorator` για κάθε συνάρτηση, και αυτή θα επιστρέψει τη συνάρτηση-κάλυμμα του cache. Αυτό είναι πολύ καλό, γιατί μπορούμε να έχουμε πολλές συναρτήσεις που μπορούν να χρησιμοποιήσουν αυτό το χαρακτηριστικό, και το μόνο που χρειάζεται να κάνουμε είναι να εφαρμόσουμε τη `cachingDecorator` σε αυτές.
48+
Η ιδέα είναι ότι μπορούμε να καλέσουμε τον `cachingDecorator` για κάθε συνάρτηση, και αυτός θα επιστρέψει τη συνάρτηση-κάλυμμα του cache. Αυτό είναι πολύ καλό, γιατί μπορούμε να έχουμε πολλές συναρτήσεις που μπορούν να χρησιμοποιήσουν αυτό το χαρακτηριστικό, και το μόνο που χρειάζεται να κάνουμε είναι να εφαρμόσουμε τον `cachingDecorator` σε αυτές.
4949

5050
Με το να διαχωρίζουμε το caching από τη συνάρτηση με τον βασικό κώδικα, διατηρούμε και τον βασικό κώδικα πιο απλό.
5151

52-
Το αποτέλεσμα της `cachingDecorator(func)` είναι μια συνάρτηση-κάλυμμα: `function(x)` που καλύπτει το κάλεσμα της `func(x)` σε λογική caching:
52+
Το αποτέλεσμα της `cachingDecorator(func)` είναι μια συνάρτηση-κάλυμμα: `function(x)` που "καλύπτει" το κάλεσμα της `func(x)` με λογική caching:
5353

5454
![](decorator-makecaching-wrapper.svg)
5555

56-
Από εξωτερικό κώδικα, η συνάρτηση επικαλύπτεται `slow` κάνει ακόμα το ίδιο. Απλά προστέθηκε ένα caching στοιχείο στη συμπεριφορά της.
56+
Από κάποιον εξωτερικό κώδικα, η συνάρτηση που επικαλύπτεται `slow` συνεχίζει να κάνει το ίδιο. Απλά προστέθηκε ένας caching παράγοντας στη συμπεριφορά της.
5757

58-
Για να συνοψίσουμε, υπάρχουν αρκετά πλεονεκτήματα της χρήσης μιας ξεχωριστής `cachingDecorator` αντί να αλλάξει ο κώδικας της ίδιας της `slow`.
58+
Για να συνοψίσουμε, υπάρχουν αρκετά πλεονεκτήματα της χρήσης ενός ξεχωριστού `cachingDecorator` αντί να αλλάξει ο κώδικας της ίδιας της `slow`.
5959

60-
- H `cachingDecorator` είναι επαναχρησιμοποιήσιμη. Μπορούμε να την εφαρμόσουμε σε άλλη συνάρτηση.
60+
- Ο `cachingDecorator` είναι επαναχρησιμοποιήσιμος. Μπορούμε να την εφαρμόσουμε σε άλλη συνάρτηση.
6161
- Η λογική cache είναι διαχωρισμένη, δεν αύξησε τη πολυπλοκότητα της ίδιας της `slow` (εαν υπήρχε κάποια).
6262
- Μπορούμε να συνδυάσουμε πολλαπλούς διακοσμητές αν χρειάζεται (οι άλλοι διακοσμητές θα ακολουθήσουν).
6363

@@ -116,7 +116,7 @@ let func = worker.slow;
116116
func(2);
117117
```
118118

119-
Οπότε, το κάλυμμα δίνει τη κλήση στην αρχική μέθοδο, αλλά χωρίς το context `this`. Έτσι δημιουργείτε το error.
119+
Οπότε, η συνάρτηση-κάλυμμα δίνει τη κλήση στην αρχική μέθοδο, αλλά χωρίς το πλαίσιο `this`. Έτσι δημιουργείτε το error.
120120

121121
Ας το διορθώσουμε.
122122

@@ -139,7 +139,7 @@ func.call(obj, 1, 2, 3)
139139

140140
Καλούν και οι δύο τη `func` με ορίσματα τα `1`, `2` and `3`. Η μόνη διαφορά είναι ότι η `func.call` επίσης θέτει το `this` στο `obj`.
141141

142-
Σαν παράδειγμα, στον κώδικα από κάτω, καλούμε τη `sayHi` στο context διαφορετικών αντικειμένων: η `sayHi.call(user)` τρέχει τη `sayHi` δίνοντας `this=user`, και η επόμενη γραμμή θέτει `this=admin`:
142+
Σαν παράδειγμα, στον κώδικα από κάτω, καλούμε τη `sayHi` στο πλαίσιο διαφορετικών αντικειμένων: η `sayHi.call(user)` τρέχει τη `sayHi` δίνοντας `this=user`, και η επόμενη γραμμή θέτει `this=admin`:
143143

144144
```js run
145145
function sayHi() {
@@ -164,7 +164,7 @@ function say(phrase) {
164164
let user = { name: "Γιάννης" };
165165

166166
// ο χρήστης γίνεται this, και το "Γεια σου" γίνεται το πρώτο όρισμα
167-
say.call( user, "Γεια σου" ); // Γιάννης: Γεια σου
167+
say.call( user, "Γεια" ); // Γιάννης: Γεια
168168
```
169169

170170
Στη περίπτωση μας, μπορούμε να χρησιμοποιήσουμε τη `call` στη συνάρτηση-κάλυμμα για να δώσουμε το context στην αρχική συνάρτηση:
@@ -205,13 +205,13 @@ alert( worker.slow(2) ); // δουλεύει, δεν καλεί το αρχικ
205205

206206
Για να γίνουν όλα πιο ξεκάθαρα, ας δούμε πιο βαθιά πώς το `this` περνάει μέσα από τις κλήσεις:
207207

208-
1. Μετά τη διακόσμηση η `worker.slow` είναι τώρα το κάλυμμα `function (x) { ... }`.
208+
1. Μετά τη διακόσμηση η `worker.slow` είναι τώρα η συνάρτηση-κάλυμμα `function (x) { ... }`.
209209
2. Οπότε όταν η `worker.slow(2)` εκτελείται, η συνάρτηση-κάλυμμα παίρνει `2` σαν ένα όρισμα και το `this=worker` (είναι το αντικέιμενο πρίν τη τελεία).
210210
3. Μέσα στη συνάρτηση-κάλυμμα, υποθέτωντας ότι το αποτέλεσμα δεν έχει γίνει ακόμα cached, η `func.call(this, x)` δίνει το τωρινό `this` (`=worker`) και το τωρινό όρισμα (`=2`) στην αρχική μέθοδο.
211211

212212
## Πολλαπλά ορίσματα με τη "func.apply"
213213

214-
Τώρα ας κάνουμε τη `cachingDecorator` ακόμα πιο γενική. Μέχρι τώρα δούλευε μόνο με συναρτήσεις με ένα όρισμα.
214+
Τώρα ας κάνουμε τον `cachingDecorator` ακόμα πιο γενικό. Μέχρι τώρα δούλευε μόνο με συναρτήσεις με ένα όρισμα.
215215

216216
Πώς γίνεται να κάνουμε cache τη μέθοδο `worker.slow` που έχει πολλαπλά ορίσματα?
217217

@@ -392,11 +392,11 @@ hash(1, 2);
392392

393393
## Διακοσμητές και ιδιότητες συναρτήσεων
394394

395-
Είναι γενικά ασφαλής η αντικατάσταση μιας συνάρτησης η μιας μεθόδου με μια διακοσμημένη, εκτός από ένα μικρό πράγμα. Αν η αρχική συνάρτηση έχει ιδιότητες μέσα της, όπως η `func.calledCount` η οποιαδήποτε άλλη, τότε η διακοσμημένη συνάρτηση δεν θα της διαθέσει. Διότι αυτή είναι ένα κάλυμμα. Οπότε θέλουν ιδιαίτερη προσόχη στη χρήση τους.
395+
Είναι γενικά ασφαλής η αντικατάσταση μιας συνάρτησης η μιας μεθόδου με μια διακοσμημένη, εκτός από μια μικρή περίπτωση. Αν η αρχική συνάρτηση έχει ιδιότητες μέσα της, όπως η `func.calledCount` η οποιαδήποτε άλλη, τότε η διακοσμημένη συνάρτηση δεν θα της διαθέσει. Διότι αυτή είναι μια συνάρτηση-κάλυμμα. Οπότε θέλουν ιδιαίτερη προσόχη στη χρήση τους.
396396

397-
Π.χ. στο παράδειγμα πάνω αν η συνάρτηση `slow` είχε ιδιότητες μέσα της, τότε η `cachingDecorator(slow)` είναι ένας wrapper χωρίς αυτές.
397+
Π.χ. στο παράδειγμα πάνω αν η συνάρτηση `slow` είχε ιδιότητες μέσα της, τότε ο `cachingDecorator(slow)` είναι μια συνάρτηση-κάλυμμα χωρίς αυτές.
398398

399-
Κάποιοι διακοσμητές ενδέχεται να προσφέρουν τις δικές τους ιδιότητες. Π.χ. ένας διακοσμητής μπορεί να μετράει πόσες φορές μια συνάρτηση έτρεξε και πόσο χρόνο πήρε, και να προωθεί τη πληροφορία αυτή μέσω ιδιοτήτων του wrapper.
399+
Κάποιοι διακοσμητές ενδέχεται να προσφέρουν τις δικές τους ιδιότητες. Π.χ. ένας διακοσμητής μπορεί να μετράει πόσες φορές μια συνάρτηση έτρεξε και πόσο χρόνο πήρε, και να προωθεί τη πληροφορία αυτή μέσω ιδιοτήτων της συνάρτησης-κάλυμμα.
400400

401401
Υπάρχει ένας τρόπος για να δημιουργηθούν διακοσμητές που κρατάνε πρόσβαση στις ιδιότητες της συνάρτησης, αλλά αυτό απαιτεί τη χρήση ενός ειδικού `Proxy` αντικέιμενου για να περικλύσει την συνάρτηση. Θα το συζητήσουμε αυτό αργότερα στο άρθρο <info:proxy#proxy-apply>.
402402

images.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
decorator-makecaching-wrapper.svg:
2-
"wrapper":
3-
text: "ραππερ"
2+
"wrapper":
3+
text: "ραππερ"

0 commit comments

Comments
 (0)