You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardexpand all lines: 1-js/06-advanced-functions/09-call-apply-decorators/article.md
+17-17
Original file line number
Diff line number
Diff line change
@@ -8,7 +8,7 @@
8
8
9
9
Αν η συνάρτηση καλείται συχνά, ενδέχεται να θέλουμε να κάνουμε cache (θυμόμαστε) τα αποτελέσματα προκείμενου να μην χρειάζεται να δαπανήσουμε επιπλέον χρόνο σε επανυπολογισμούς.
10
10
11
-
Όμως, αντί να προσθέσουμε αυτή τη λειτουργικότητα στη `slow()` θα δημιουρήσουμε μια συνάρτηση "κάλυμμα", η οποία θα προσθέσει το caching. Όπως θα δούμε, υπάρχουν αρκετά πλεονεκτήματα σε αυτή τη μέθοδο.
11
+
Όμως, αντί να προσθέσουμε αυτή τη λειτουργικότητα στη `slow()` θα δημιουρήσουμε μια συνάρτηση-κάλυμμα, η οποία θα προσθέσει το caching. Όπως θα δούμε, υπάρχουν αρκετά πλεονεκτήματα σε αυτή τη μέθοδο.
12
12
13
13
Αυτός είναι ο κώδικας, και οι επεξηγήσεις ακολουθούν:
14
14
@@ -37,27 +37,27 @@ function cachingDecorator(func) {
37
37
slow =cachingDecorator(slow);
38
38
39
39
alert( slow(1) ); // slow(1) είναι cached
40
-
alert( "Again: "+slow(1) ); // το ίδιο
40
+
alert( "Ξανά: "+slow(1) ); // το ίδιο
41
41
42
42
alert( slow(2) ); // slow(2) είναι cached
43
-
alert( "Again: "+slow(2) ); // το ίδιο με τη προηγούμενη γραμμή
43
+
alert( "Ξανά: "+slow(2) ); // το ίδιο με τη προηγούμενη γραμμή
44
44
```
45
45
46
-
Στον από πάνω κώδικα, η`cachingDecorator` είναι ένας *διακοσμητής*, μια ειδική συνάρτηση η οποία παίρνει μια άλλη συνάρτηση και επηρεάζει την συμπεριφορά της.
46
+
Στον από πάνω κώδικα, ο`cachingDecorator` είναι ένας *διακοσμητής*: μια ειδική συνάρτηση η οποία παίρνει μια άλλη συνάρτηση και επηρεάζει την συμπεριφορά της.
47
47
48
-
Η ιδέα είναι ότι μπορούμε να καλέσουμε την`cachingDecorator` για κάθε συνάρτηση, και αυτή θα επιστρέψει τη συνάρτηση-κάλυμμα του cache. Αυτό είναι πολύ καλό, γιατί μπορούμε να έχουμε πολλές συναρτήσεις που μπορούν να χρησιμοποιήσουν αυτό το χαρακτηριστικό, και το μόνο που χρειάζεται να κάνουμε είναι να εφαρμόσουμε τη`cachingDecorator` σε αυτές.
48
+
Η ιδέα είναι ότι μπορούμε να καλέσουμε τον`cachingDecorator` για κάθε συνάρτηση, και αυτός θα επιστρέψει τη συνάρτηση-κάλυμμα του cache. Αυτό είναι πολύ καλό, γιατί μπορούμε να έχουμε πολλές συναρτήσεις που μπορούν να χρησιμοποιήσουν αυτό το χαρακτηριστικό, και το μόνο που χρειάζεται να κάνουμε είναι να εφαρμόσουμε τον`cachingDecorator` σε αυτές.
49
49
50
50
Με το να διαχωρίζουμε το caching από τη συνάρτηση με τον βασικό κώδικα, διατηρούμε και τον βασικό κώδικα πιο απλό.
51
51
52
-
Το αποτέλεσμα της `cachingDecorator(func)` είναι μια συνάρτηση-κάλυμμα: `function(x)` που καλύπτει το κάλεσμα της `func(x)`σε λογική caching:
52
+
Το αποτέλεσμα της `cachingDecorator(func)` είναι μια συνάρτηση-κάλυμμα: `function(x)` που "καλύπτει" το κάλεσμα της `func(x)`με λογική caching:
53
53
54
54

55
55
56
-
Από εξωτερικό κώδικα, η συνάρτηση επικαλύπτεται `slow`κάνει ακόμα το ίδιο. Απλά προστέθηκε ένα caching στοιχείο στη συμπεριφορά της.
56
+
Από κάποιον εξωτερικό κώδικα, η συνάρτηση που επικαλύπτεται `slow`συνεχίζει να κάνει το ίδιο. Απλά προστέθηκε ένας caching παράγοντας στη συμπεριφορά της.
57
57
58
-
Για να συνοψίσουμε, υπάρχουν αρκετά πλεονεκτήματα της χρήσης μιας ξεχωριστής`cachingDecorator` αντί να αλλάξει ο κώδικας της ίδιας της `slow`.
58
+
Για να συνοψίσουμε, υπάρχουν αρκετά πλεονεκτήματα της χρήσης ενός ξεχωριστού`cachingDecorator` αντί να αλλάξει ο κώδικας της ίδιας της `slow`.
59
59
60
-
-H`cachingDecorator` είναι επαναχρησιμοποιήσιμη. Μπορούμε να την εφαρμόσουμε σε άλλη συνάρτηση.
60
+
-Ο`cachingDecorator` είναι επαναχρησιμοποιήσιμος. Μπορούμε να την εφαρμόσουμε σε άλλη συνάρτηση.
61
61
- Η λογική cache είναι διαχωρισμένη, δεν αύξησε τη πολυπλοκότητα της ίδιας της `slow` (εαν υπήρχε κάποια).
62
62
- Μπορούμε να συνδυάσουμε πολλαπλούς διακοσμητές αν χρειάζεται (οι άλλοι διακοσμητές θα ακολουθήσουν).
63
63
@@ -116,7 +116,7 @@ let func = worker.slow;
116
116
func(2);
117
117
```
118
118
119
-
Οπότε, το κάλυμμα δίνει τη κλήση στην αρχική μέθοδο, αλλά χωρίς το context`this`. Έτσι δημιουργείτε το error.
119
+
Οπότε, η συνάρτηση-κάλυμμα δίνει τη κλήση στην αρχική μέθοδο, αλλά χωρίς το πλαίσιο`this`. Έτσι δημιουργείτε το error.
120
120
121
121
Ας το διορθώσουμε.
122
122
@@ -139,7 +139,7 @@ func.call(obj, 1, 2, 3)
139
139
140
140
Καλούν και οι δύο τη `func` με ορίσματα τα `1`, `2` and `3`. Η μόνη διαφορά είναι ότι η `func.call` επίσης θέτει το `this` στο `obj`.
141
141
142
-
Σαν παράδειγμα, στον κώδικα από κάτω, καλούμε τη `sayHi` στο context διαφορετικών αντικειμένων: η `sayHi.call(user)` τρέχει τη `sayHi` δίνοντας `this=user`, και η επόμενη γραμμή θέτει `this=admin`:
142
+
Σαν παράδειγμα, στον κώδικα από κάτω, καλούμε τη `sayHi` στο πλαίσιο διαφορετικών αντικειμένων: η `sayHi.call(user)` τρέχει τη `sayHi` δίνοντας `this=user`, και η επόμενη γραμμή θέτει `this=admin`:
143
143
144
144
```js run
145
145
functionsayHi() {
@@ -164,7 +164,7 @@ function say(phrase) {
164
164
let user = { name:"Γιάννης" };
165
165
166
166
// ο χρήστης γίνεται this, και το "Γεια σου" γίνεται το πρώτο όρισμα
Στη περίπτωση μας, μπορούμε να χρησιμοποιήσουμε τη `call` στη συνάρτηση-κάλυμμα για να δώσουμε το context στην αρχική συνάρτηση:
@@ -205,13 +205,13 @@ alert( worker.slow(2) ); // δουλεύει, δεν καλεί το αρχικ
205
205
206
206
Για να γίνουν όλα πιο ξεκάθαρα, ας δούμε πιο βαθιά πώς το `this` περνάει μέσα από τις κλήσεις:
207
207
208
-
1. Μετά τη διακόσμηση η `worker.slow` είναι τώρα το κάλυμμα `function (x) { ... }`.
208
+
1. Μετά τη διακόσμηση η `worker.slow` είναι τώρα η συνάρτηση-κάλυμμα `function (x) { ... }`.
209
209
2. Οπότε όταν η `worker.slow(2)` εκτελείται, η συνάρτηση-κάλυμμα παίρνει `2` σαν ένα όρισμα και το `this=worker` (είναι το αντικέιμενο πρίν τη τελεία).
210
210
3. Μέσα στη συνάρτηση-κάλυμμα, υποθέτωντας ότι το αποτέλεσμα δεν έχει γίνει ακόμα cached, η `func.call(this, x)` δίνει το τωρινό `this` (`=worker`) και το τωρινό όρισμα (`=2`) στην αρχική μέθοδο.
211
211
212
212
## Πολλαπλά ορίσματα με τη "func.apply"
213
213
214
-
Τώρα ας κάνουμε τη`cachingDecorator` ακόμα πιο γενική. Μέχρι τώρα δούλευε μόνο με συναρτήσεις με ένα όρισμα.
214
+
Τώρα ας κάνουμε τον`cachingDecorator` ακόμα πιο γενικό. Μέχρι τώρα δούλευε μόνο με συναρτήσεις με ένα όρισμα.
215
215
216
216
Πώς γίνεται να κάνουμε cache τη μέθοδο `worker.slow` που έχει πολλαπλά ορίσματα?
217
217
@@ -392,11 +392,11 @@ hash(1, 2);
392
392
393
393
## Διακοσμητές και ιδιότητες συναρτήσεων
394
394
395
-
Είναι γενικά ασφαλής η αντικατάσταση μιας συνάρτησης η μιας μεθόδου με μια διακοσμημένη, εκτός από ένα μικρό πράγμα. Αν η αρχική συνάρτηση έχει ιδιότητες μέσα της, όπως η `func.calledCount` η οποιαδήποτε άλλη, τότε η διακοσμημένη συνάρτηση δεν θα της διαθέσει. Διότι αυτή είναι ένα κάλυμμα. Οπότε θέλουν ιδιαίτερη προσόχη στη χρήση τους.
395
+
Είναι γενικά ασφαλής η αντικατάσταση μιας συνάρτησης η μιας μεθόδου με μια διακοσμημένη, εκτός από μια μικρή περίπτωση. Αν η αρχική συνάρτηση έχει ιδιότητες μέσα της, όπως η `func.calledCount` η οποιαδήποτε άλλη, τότε η διακοσμημένη συνάρτηση δεν θα της διαθέσει. Διότι αυτή είναι μια συνάρτηση-κάλυμμα. Οπότε θέλουν ιδιαίτερη προσόχη στη χρήση τους.
396
396
397
-
Π.χ. στο παράδειγμα πάνω αν η συνάρτηση `slow` είχε ιδιότητες μέσα της, τότε η`cachingDecorator(slow)` είναι ένας wrapper χωρίς αυτές.
397
+
Π.χ. στο παράδειγμα πάνω αν η συνάρτηση `slow` είχε ιδιότητες μέσα της, τότε ο`cachingDecorator(slow)` είναι μια συνάρτηση-κάλυμμα χωρίς αυτές.
398
398
399
-
Κάποιοι διακοσμητές ενδέχεται να προσφέρουν τις δικές τους ιδιότητες. Π.χ. ένας διακοσμητής μπορεί να μετράει πόσες φορές μια συνάρτηση έτρεξε και πόσο χρόνο πήρε, και να προωθεί τη πληροφορία αυτή μέσω ιδιοτήτων του wrapper.
399
+
Κάποιοι διακοσμητές ενδέχεται να προσφέρουν τις δικές τους ιδιότητες. Π.χ. ένας διακοσμητής μπορεί να μετράει πόσες φορές μια συνάρτηση έτρεξε και πόσο χρόνο πήρε, και να προωθεί τη πληροφορία αυτή μέσω ιδιοτήτων της συνάρτησης-κάλυμμα.
400
400
401
401
Υπάρχει ένας τρόπος για να δημιουργηθούν διακοσμητές που κρατάνε πρόσβαση στις ιδιότητες της συνάρτησης, αλλά αυτό απαιτεί τη χρήση ενός ειδικού `Proxy` αντικέιμενου για να περικλύσει την συνάρτηση. Θα το συζητήσουμε αυτό αργότερα στο άρθρο <info:proxy#proxy-apply>.
0 commit comments