πώς να προφέρει anachronism;
a-nach-ro-nism
Οι μέθοδοι είναι σύγχρονη από προεπιλογή. Για να τους κάνουν ασύγχρονη, θα πρέπει να προσθέσετε αυτό το χαρακτηριστικό [OperationContract (AsyncPattern = true)] και να επιστρέψει ένα IAsynchResult, όπως ακριβώς θα κάνατε αν ήσασταν κάνει BeginIvoke () με WinForms. (διαβάστε περισσότερα εδώ <http://msdn.microsoft.com/en-us/library/ms734701.aspx> )


Μπορείτε να κάνετε δημοσιεύσεων / συνδρομών με κάτι που ονομάζεται επανάκλησης Συμβόλαιο (αν im δεν είναι σίγουρος για την εφαρμογή αυτή σε άλλες πλατφόρμες) Δεν έχω μεγάλη εμπειρία με αυτά, αλλά δεν φαίνεται εξαιρετικά complected (μπορείτε να διαβάσετε περισσότερα εδώ [http: //dotnetaddict.dotnetdevelopersjournal.com/wcf\_alarmclock.htm](http://dotnetaddict.dotnetdevelopersjournal.com/wcf_alarmclock.htm) ) Σε ένα καθαρό λειτουργικό στιλ, δεν πρόκειται ποτέ να αντικαταστήσετε κάθε μεταβλητή.


Μια αναλογία θα ήταν να χωροχρόνο στη φυσική. Αν θεωρείτε τον κόσμο ως 3δ, τότε τα αντικείμενα δεν έχουν σταθερές θέσεις - κινούνται πάροδο του χρόνου. Για να φέρει τα μαθηματικά για να φέρουν στο φυσικό κόσμο, ως εκ τούτου, να προσθέσετε μια διάσταση χρόνου και να εξετάσει τις τιμές των διαφόρων ιδιοτήτων σε συγκεκριμένες χρονικές στιγμές. Με τον τρόπο αυτό, έχουμε κάνει τα αντικείμενα της μελέτης μας σε σταθερές. Ομοίως, στον προγραμματισμό, υπάρχει μια εννοιολογική απλότητα που θα είχε από την εργασία με αμετάβλητες τιμές. Αντικείμενα με μια ταυτότητα στον πραγματικό κόσμο μπορεί να μοντελοποιηθεί ως μία ακολουθία αναλλοίωτες αξίες (τα κράτη του αντικειμένου στην αύξηση φορές) και όχι ως μια ενιαία τιμή που αλλάζει.


Φυσικά οι λεπτομέρειες για το πώς να συνδέσει την ακολουθία των τιμών σε μια «ταυτότητα αντικειμένου» μπορεί να είναι λίγο τριχωτό. Haskell έχει [Μονάδες](http://en.wikipedia.org/wiki/Monad_(functional_programming)) που θα αφήσει το μοντέλο κράτους. [Λειτουργική Αντιδραστική Προγραμματισμός](http://en.wikipedia.org/wiki/Functional_reactive_programming) είναι μια πιο κυριολεκτική προσπάθεια μοντελοποίηση αντικειμένων στον κόσμο με καθαρό λειτουργικό ενημερώσεις, που πιστεύω ότι είναι μια πολλά υποσχόμενη κατεύθυνση για τον προγραμματισμό.


Θα σημειωθεί ότι Clojure, σε αντίθεση με Haskell, δεν είναι καθαρό, και μπορείτε να ενημερώσετε τις μεταβλητές, όπως προτείνατε. Αν κάνετε ενημέρωση μόνο μερικές μεταβλητές σε υψηλό επίπεδο, θα εξακολουθούν πιθανώς να απολαύσουν πολλές από τις εννοιολογικές οφέλη απλότητα του λειτουργικού προγραμματισμού. Ήρθα προς την αντίθετη κατεύθυνση, από ένα φόντο EE πήρα στον προγραμματισμό και πήγε πίσω στο σχολείο για να πάρει ένα βαθμό CS. Θα ήθελα να συστήσω ξεκινάμε με κάτι που συνδυάζει και τα δύο, προκειμένου να καταστεί η μετάβαση λίγο πιο ομαλή. Υπάρχουν τόνοι των χομπίστα βιβλία όπως [γίνουν τα πράγματα Talk](http://rads.stackoverflow.com/amzn/click/0596510519) , και [Hardware Hacking έργα](http://rads.stackoverflow.com/amzn/click/0596003145) που κάνουν αυτό το πιο εύκολο. Θα ήθελα να συστήσω επίσης τη [Evil Genius](http://rads.stackoverflow.com/amzn/click/0071448810) σειρά από βιβλία σχετικά με την ηλεκτρονική και ρομποτική κυκλώματα.


Charles Petzold του [Κώδικα: Η κρυμμένη Γλώσσα Υλικό υπολογιστών και λογισμικού](http://www.charlespetzold.com/code/index.html) είναι ένα άλλο βιβλίο που κάνει σπουδαία δουλειά της σύνδεσης εννοιών του υλικού και του λογισμικού μαζί. Δεν μπορώ να το συστήσω ιδιαίτερα αρκετό, αν και μπορεί να λαμβάνει μια αντίθετη προσέγγιση από ό, τι είστε μετά. Ξεκινά με απλούς διακόπτες και τρανζίστορ και χτίζει μέχρι να δείξει πώς από όπου και αν συνδυάζονται για να κάνουν ένα προγραμματιζόμενο κύκλωμα. [Κόκκινο-μαύρο](http://en.wikipedia.org/wiki/Red-black_tree) είναι καλύτερο από το AVL για την εισαγωγή-βαριές εφαρμογές. Αν έχετε προβλέψει σχετικά ομοιόμορφη εμφάνιση-up, στη συνέχεια, κόκκινο-μαύρο είναι ο τρόπος να πάει. Αν έχετε προβλέψει μια σχετικά ισορροπημένη ματιά-up, όπου θεωρείται πιο πρόσφατα στοιχεία είναι πιο πιθανό να είναι ορατό και πάλι, θέλετε να χρησιμοποιήσετε [τα δέντρα άτεχνος](http://en.wikipedia.org/wiki/Splay_tree) . Karl είναι απολύτως σωστό, δεν υπάρχει ανάγκη να ρυθμίσετε αντικείμενα για να άκυρη μετά τη χρήση. Αν ένα αντικείμενο υλοποιεί `IDisposable`, απλά φροντίστε να καλέσετε `IDisposable.Dispose()`όταν τελειώσετε με αυτό το αντικείμενο (τυλιγμένο σε μια `try`.. `finally`, ή, ένα `using()`μπλοκ). Αλλά ακόμα και αν δεν θυμάστε να καλέσετε `Dispose()`, η μέθοδος finaliser στο αντικείμενο θα πρέπει να καλούν `Dispose()`για εσάς.


Σκέφτηκα ότι αυτό ήταν μια καλή θεραπεία:


[Σκάβοντας σε IDisposable](http://msdn.microsoft.com/en-us/magazine/cc163392.aspx)


και αυτό 


[Κατανόηση IDisposable](http://web.archive.org/web/20090426210049/www.marcclifton.com/tabid/79/Default.aspx)


Δεν υπάρχει κανένα νόημα να προσπαθούμε να μαντέψουμε το δεύτερο το GC και τις στρατηγικές διαχείρισης της επειδή είναι μόνος ρύθμιση και αδιαφανές. Υπήρξε μια καλή συζήτηση για τις εσωτερικές διεργασίες με Jeffrey Ρίχτερ στο Dot Net Rocks εδώ: [Jeffrey Ρίχτερ στο μοντέλο μνήμης των Windows](http://www.dotnetrocks.com/default.aspx?showNum=361) βιβλίου και Richters [CLR μέσω C #](http://www.compman.co.uk/scripts/browse.asp?ref=747022) κεφάλαιο 20 έχει μια πολύ καλή θεραπεία: Η σύντομη απάντηση είναι: Να είναι φοβερό.


Εάν το λογισμικό σας αντιμετωπίζει πραγματικά ένα σημείο του πόνου και αντιμετωπίζει καλά, οι άνθρωποι θα έρθουν να με δική τους (υποθέτοντας ένα λογικό ποσό της προώθησης από την πλευρά σας) μέσω SourceForge / GitHub / κλπ., Το Google, και από στόμα σε στόμα. Εάν προσελκύσει μια κρίσιμη μάζα των ανθρώπων που έχουν ανάγκη ό, τι κάνει το λογισμικό σας και πρέπει να έχει νέα χαρακτηριστικά, συνεργάτες θα έρθουν.


Επίσης: Παραμονή ενεργό. Αν δεν έχετε ενημερώσει τον κωδικό σας σε 6 μήνες, ή αν η σελίδα σας στο SourceForge λέει το λογισμικό σας έχει στην Alpha για ένα χρόνο, πολλοί άνθρωποι πρόκειται να το αγνοήσετε και να προχωρήσουμε στο επόμενο αποτέλεσμα αναζήτησης. Πάρτε το λογισμικό για το πού είναι έτοιμο για τους άλλους να χρησιμοποιούν, και να το διατηρεί.


Το πράγμα για Open Source είναι ότι πρέπει πραγματικά να αναπτυχθούν οργανικά - είναι να πληρωθούν κανείς, κανείς δεν είναι υπό την απειλή της απόλυσης - οι άνθρωποι πρέπει να *νοιάζονται για το λογισμικό σας* για να αυξηθεί πέρα από ό, τι μπορείτε να κάνετε. Δεν πρόκειται ποτέ να πάρει συνεργάτες (ή τέλος πάντων, καλές) από την προσέλκυση τους - μόνο κάνοντας κάτι που ένας καλός προγραμματιστής θα βρείτε ενδιαφέρον να εργαστεί με. <p>δεν περιγράφετε κλίμακα για να ταιριάζει. περιγράφεις την εμφάνιση. (έχω επεξεργαστεί την ερώτησή σας σε αυτό το θέμα.) η υποβολή γίνεται όσο το δυνατόν μεγαλύτερη, διατηρώντας παράλληλα την αναλογία της και προσαρμόζοντας εξ ολοκλήρου μέσα στον γονέα της.</p><p>τέλος πάντων, μπορείτε να το κάνετε αυτό με αυτόματη διάταξη. μπορείτε να το κάνετε εξ ολοκλήρου στο ib από xcode 5.1. ας ξεκινήσουμε με μερικές προβολές:</p><p><img src="https://i.stack.imgur.com/hhdxr.png" alt="some views"></p><p>η ανοιχτή πράσινη όψη έχει αναλογία διαστάσεων 4: 1. η σκούρα πράσινη προβολή έχει αναλογία διαστάσεων 1: 4. πρόκειται να δημιουργήσω περιορισμούς έτσι ώστε η μπλε όψη να γεμίζει το πάνω μισό της οθόνης, η ροζ όψη να γεμίζει το κάτω μισό της οθόνης και κάθε πράσινη προβολή να επεκτείνεται όσο το δυνατόν περισσότερο, διατηρώντας παράλληλα τον λόγο διαστάσεων και προσαρμόζοντας την δοχείο.</p><p>κατ 'αρχάς, θα δημιουργήσω περιορισμούς και στις τέσσερις πλευρές της μπλε όψης. θα το περάσω στον κοντινότερο γείτονα σε κάθε άκρη, με απόσταση 0. φροντίζω να απενεργοποιήσω τα περιθώρια:</p><p><img src="https://i.stack.imgur.com/yo2jf.gif" alt="blue constraints"></p><p>σημειώστε ότι το i <strong> δεν ενημερώνει </strong> το πλαίσιο ακόμα. θεωρώ ότι είναι ευκολότερο να αφήνετε χώρο μεταξύ των απόψεων κατά τη δημιουργία περιορισμών και απλά να ορίσετε τις σταθερές στο 0 (ή οτιδήποτε άλλο) με το χέρι.</p><p>στη συνέχεια, κλίνω το αριστερό, το κάτω και το δεξί άκρο της ροζ εικόνας στον πλησιέστερο γείτονά της. δεν χρειάζεται να ρυθμίσω έναν ανώτατο περιορισμό edge επειδή η άνω άκρη του είναι ήδη περιορισμένη στο κάτω άκρο της μπλε όψης.</p><p><img src="https://i.stack.imgur.com/spins.gif" alt="pink constraints"></p><p>χρειάζομαι επίσης έναν περιορισμό ισοδύναμων μεταξύ των ροζ και μπλε απόψεων. αυτό θα τους κάνει να γεμίσουν το ήμισυ της οθόνης:</p><p><img src="https://i.stack.imgur.com/oelrv.gif" alt="enter image description here"></p><p>αν λέω στο xcode να ενημερώσει όλα τα πλαίσια τώρα, έχω αυτό:</p><p><img src="https://i.stack.imgur.com/9fbwl.png" alt="containers laid out"></p><p>έτσι, οι περιορισμοί που έχω δημιουργήσει μέχρι τώρα είναι σωστοί. ανεξάρτητα από αυτό και να αρχίσετε να εργάζεστε με την ανοιχτό πράσινη όψη.</p><p>η τοποθέτηση σε πτυχές της ανοιχτής πράσινης προβολής απαιτεί πέντε περιορισμούς:</p><ul> <li>απαιτούμενος λόγος αναλογίας διαστάσεων προτεραιότητας στην ανοιχτό πράσινη όψη. μπορείτε να δημιουργήσετε αυτόν τον περιορισμό σε xib ή storyboard με xcode 5.1 ή νεότερη έκδοση.</li> <li>ο περιορισμός της απαιτούμενης προτεραιότητας που περιορίζει το πλάτος της ανοιχτό πράσινης όψης να είναι μικρότερο ή ίσο με το πλάτος του δοχείου.</li> <li>ένας περιορισμός υψηλής προτεραιότητας που καθορίζει το πλάτος της ανοιχτής πράσινης όψης να είναι ίσο με το πλάτος του δοχείου.</li> <li>ο περιορισμός της απαιτούμενης προτεραιότητας που περιορίζει το ύψος της ανοιχτής πράσινης όψης να είναι μικρότερο ή ίσο με το ύψος του δοχείου.</li> <li>ένας περιορισμός υψηλής προτεραιότητας που θέτει το ύψος της ανοιχτής πράσινης όψης να είναι ίσο με το ύψος του δοχείου.</li> </ul><p>ας εξετάσουμε τους δύο περιορισμούς πλάτους. ο περιορισμός που δεν είναι ο ίδιος, είναι επαρκής για να καθορίσει το πλάτος της ανοιχτής πράσινης όψης. πολλά πλάτη θα ταιριάζουν με τον περιορισμό. δεδομένου ότι υπάρχει ασάφεια, το autolayout θα προσπαθήσει να επιλέξει μια λύση που ελαχιστοποιεί το σφάλμα στον άλλο περιορισμό (υψηλής προτεραιότητας αλλά όχι υποχρεωτικό). η ελαχιστοποίηση του σφάλματος σημαίνει ότι το πλάτος είναι όσο το δυνατόν πλησιέστερο στο πλάτος του κιβωτίου, ενώ δεν παραβιάζεται ο απαιτούμενος περιορισμός που δεν είναι μικρός ή ίσος.</p><p>το ίδιο συμβαίνει και με τον περιορισμό του ύψους. και επειδή απαιτείται επίσης ο περιορισμός της αναλογίας πλευρών, μπορεί να μεγιστοποιηθεί το μέγεθος του υποβιβασμού κατά μήκος ενός άξονα (εκτός αν ο περιέκτης έχει την ίδια αναλογία διαστάσεων με την υποέκθεση).</p><p>έτσι πρώτα δημιουργώ τον περιορισμό της αναλογίας διαστάσεων:</p><p><img src="https://i.stack.imgur.com/4ihow.gif" alt="top aspect"></p><p>στη συνέχεια, δημιουργώ ίσους περιορισμούς πλάτους και ύψους με το δοχείο:</p><p><img src="https://i.stack.imgur.com/vycag.gif" alt="top equal size"></p><p>πρέπει να επεξεργαστώ αυτούς τους περιορισμούς ώστε να είναι λιγότερο από-ή-ίσους περιορισμούς:</p><p><img src="https://i.stack.imgur.com/bc7rh.gif" alt="top less than or equal size"></p><p>στη συνέχεια πρέπει να δημιουργήσω ένα άλλο σύνολο ίσων περιορισμών πλάτους και ύψους με το δοχείο:</p><p><img src="https://i.stack.imgur.com/u9hkm.gif" alt="top equal size again"></p><p>και πρέπει να θέσω τους νέους αυτούς περιορισμούς λιγότερο από την απαιτούμενη προτεραιότητα:</p><p><img src="https://i.stack.imgur.com/i7dte.gif" alt="top equal not required"></p><p>τελικά, ζητήσατε να είναι κεντραρισμένο το υποπεριοχή στο δοχείο του, οπότε θα ρυθμίσω αυτούς τους περιορισμούς:</p><p><img src="https://i.stack.imgur.com/4dtr1.gif" alt="top centered"></p><p>τώρα, για να δοκιμάσετε, θα επιλέξω τον ελεγκτή προβολής και θα ζητήσω από το xcode να ενημερώσει όλα τα πλαίσια. αυτό έχω:</p><p><img src="https://i.stack.imgur.com/kmtoy.png" alt="incorrect top layout"></p><p>ωχ! το subview έχει επεκταθεί για να γεμίσει πλήρως το δοχείο του. αν το επιλέξω, μπορώ να δω ότι στην πραγματικότητα διατηρείται η αναλογία του, αλλά κάνει μια πτυχή - <strong> συμπληρώστε </strong> αντί για μια πτυχή - <strong> ταιριάζει </strong>.</p><p>το πρόβλημα είναι ότι σε έναν λιγότερο από ή ίσο περιορισμό, έχει σημασία ποια είναι η άποψη σε κάθε άκρο του περιορισμού, και το xcode έχει δημιουργήσει τον περιορισμό απέναντι από την προσδοκία μου. θα μπορούσα να επιλέξω καθέναν από τους δύο περιορισμούς και να αντιστρέψω το πρώτο και δεύτερο στοιχείο. αντ 'αυτού, θα επιλέξω μόνο το subview και θα αλλάξω τους περιορισμούς ώστε να είναι μεγαλύτερο από-ή-ίσο:</p><p><img src="https://i.stack.imgur.com/mh4xm.gif" alt="fix top constraints"></p><p>το xcode ενημερώνει τη διάταξη:</p><p><img src="https://i.stack.imgur.com/srvqg.png" alt="correct top layout"></p><p>τώρα κάνω όλα τα ίδια πράγματα με τη σκούρα πράσινη θέα στο κάτω μέρος. πρέπει να σιγουρευτώ ότι η αναλογία πλευρών είναι 1: 4 (το xcode το μείωσε με περίεργο τρόπο αφού δεν είχε περιορισμούς). δεν θα δείξω τα βήματα ξανά, αφού είναι τα ίδια. εδώ είναι το αποτέλεσμα:</p><p><img src="https://i.stack.imgur.com/kdj1r.png" alt="correct top and bottom layout"></p><p>τώρα μπορώ να το εκτελέσω στον προσομοιωτή iphone 4s, ο οποίος έχει διαφορετικό μέγεθος οθόνης από τον ib που χρησιμοποιείται και δοκιμή περιστροφής:</p><p><img src="https://i.stack.imgur.com/hpa6w.gif" alt="iphone 4s test"></p><p>και μπορώ να δοκιμάσω στο iphone 6 προσομοιωτή:</p><p><img src="https://i.stack.imgur.com/otbq9.gif" alt="iphone 6 test"></p><p>έχω ανεβάσει τον τελικό πίνακα ιστορικού μου στο <a href="https://gist.github.com/mayoff/d9320088ab4025c95e40">αυτό το gist</a> για την ευκολία σας.</p> Νομίζω ότι το κύριο πρακτικό πλεονέκτημα στη μάθηση πράγματα χαμηλού επιπέδου όπως η γλώσσα συναρμολόγησης, δείκτες και διαχείριση μνήμης είναι ότι όταν γράφετε ή την αναθεώρηση κώδικα υψηλού επιπέδου είστε σε θέση καλύτερα να ενστικτωδώς ή υποσυνείδητα ζητήματα τόπου ή άλλες παγίδες.


Ένα μέσο για την ανάπτυξη, θα μπορούσε να γράψει ένα απλό βρόχο και να σκεφτεί, «Αυτός ο κωδικός επαναλαμβάνεται σε ένα σύνολο ακεραίων και γράφει κάθε στην κονσόλα.»


Ένας προγραμματιστής ειδικός μπορεί να γράψει το ίδιο βρόχο και να σκεφτεί, «Αυτός ο κωδικός επαναλαμβάνεται σε μια σειρά ακεραίων, και έχει να κουτί κάθε στοιχείο για να καλέσετε τη μέθοδο toString και toString πρέπει να διαμορφώσετε το κορδόνι στη βάση 10, η οποία είναι κάπως μη τετριμμένη, και τότε τόσο το κουτί ακέραιο και η διαμορφωμένη κλωστή θα είναι σύντομα επιλέξιμες για τη συλλογή των απορριμμάτων, καθώς δεν αναφορές θα παραμείνει, και η πρώτη φορά που αυτή η μέθοδος λειτουργεί, θα πρέπει να JIT'ed ...»και ούτω καθεξής.


9 φορές από τα 10, μπορεί να μην έχει σημασία. Αλλά αυτό 1 ώρα στους 10, ο κύριος του έργου των εμπειρογνωμόνων είναι πιθανό να παρατηρήσετε ένα πρόβλημα στον κώδικα που ο μέσος προγραμματιστής ποτέ δεν θα σκεφτόταν να εξετάσει. Χρησιμοποιούμε [MbUnit](http://www.mbunit.com/) και [Rihno χλευάζει](http://www.ayende.com/Blog/archive/2007/03/28/Rhino-Mocks-3.0-Released.aspx) και να αποδειχθεί ότι λειτουργεί πολύ καλά μαζί. Όταν κάνετε TDD θα πρέπει σχεδόν σίγουρα να κάνετε κάποια μορφή ένεσης εξάρτησης, ενώ αυτό μπορεί να γίνει με το χέρι, την αξία του κοιτάζοντας ένα δοχείο ΔΟΕ, όπως [το Κάστρο του Windsor](http://www.castleproject.org/projects/windsor/) .


Είναι καλά αξίζει κοιτάζοντας την οθόνη του Ιωάννη Παύλου Bodhood του ρίχνει για να ξεκινήσετε. [Blog JPB του](http://www.jpboodhoo.com/) Διακλάδωση σε ανατροπή διευκολύνεται από ένα πολύ πολύ ελαφριά και αποτελεσματική εγκατάσταση αντιγραφή.


Διακλάδωση και tagging είναι ουσιαστικά η ίδια. Απλά αντιγράψτε ολόκληρο το φάκελο στο χώρο αποθήκευσης κάπου αλλού στο αποθετήριο χρησιμοποιώντας την `svn copy`εντολή.


Βασικά, αυτό σημαίνει ότι είναι κατά συνθήκη τι αντιγραφή ενός φακέλου σημαίνει - είτε πρόκειται για ένα αντίγραφο ασφαλείας, ετικέτα, υποκατάστημα ή whater. Ανάλογα με το πώς θέλετε να σκεφτείτε για τα πράγματα (συνήθως ανάλογα με το ποιο εργαλείο SCM έχετε χρησιμοποιήσει στο παρελθόν) θα πρέπει να δημιουργηθεί μια δομή φάκελο μέσα αποθήκευσης σας για να υποστηρίξει το στυλ σας.


Κοινή στυλ είναι να έχουμε ένα σωρό φακέλους στην κορυφή του χώρου αποθήκευσης σας ονομάζεται `tags`, `branches`, `trunk`, κλπ - που σας επιτρέπει να αντιγράψετε όλη σας `trunk`(ή υπο-ομάδες) στους `tags`ή / και `branches`φακέλους. Αν έχετε περισσότερα από ένα έργο μπορεί να θέλετε να αναπαράγουν αυτό το είδος της δομής κάτω από κάθε έργου:


Μπορεί να πάρει λίγο χρόνο για να συνηθίσουν στην ιδέα - αλλά δουλεύει - απλά φροντίστε να (και την ομάδα σας) είναι σαφείς σχετικά με τις συμβάσεις που πρόκειται να χρησιμοποιήσετε. Είναι επίσης μια καλή ιδέα να έχουμε μια καλή σύμβαση ονοματοδοσίας - κάτι που εξηγεί γιατί το υποκατάστημα / tag έγινε και κατά πόσο εξακολουθεί να είναι σκόπιμο - να εξετάσει τρόπους κλάδους αρχειοθέτησης που είναι παρωχημένες.