Σελίδα 1 από 3 123 ΤελευταίαΤελευταία
Εμφάνιση αποτελεσμάτων 1 μέχρι 10 από 27

Θέμα: Προγραμματισμός με object Pascal (Delphi)

  1. #1
    Μέλος
    Ημερομηνία εγγραφής
    Mar 2012
    Θέση
    Athens, , Greece.
    Ιδιότητα:
    Αγνωστη
    Απαντήσεις
    99

    Προγραμματισμός με object Pascal (Delphi)


    Ηλεκτρονικό κατάστημα ειδών θέρμανσης και κλιματισμού

    Σκέφτομαι να γράψω κάποια κείμενα για αντικειμενοστρεφή προγραμματισμό σε object pascal (Delphi). Δεν σκοπεύω να περιγράψω την γλώσσα αλλά να διατυπώσω κάποιους κανόνες και πρακτικές που έχω καταλήξει.

    Μια πιθανή λίστα θεμάτων είναι η ακόλουθη.
    1. Κλάση & αντικείμενα (Class vs Object). Πως και γιατί.
    2. Object encapsulation, πολυμορφισμός, κληρονομικότητα.
    3. Τυπική εφαρμογή, ενημέρωση της οθόνης και χρονοβόρες διαδικασίες.
    4. TCP/IP sockets
    5. Διεργασίες - Νήματα (Threads) σαν κομμάτι επεξεργασίας.
    6. Πολυνηματικός TCP/IP Server
    7. Modbus επικοινωνία μέσω TCP/IP
    8. Σειριακή επικοινωνία. Διαγράμματα αλλαγής κατάστασης.

    Υπάρχει ενδιαφέρον ?

  2. #2
    Εξέχον μέλος
    Ημερομηνία εγγραφής
    Oct 2010
    Θέση
    Athens, , Greece.
    Ιδιότητα:
    Αγνωστη
    Απαντήσεις
    1,632
    Πανε πολλα χρονια που εχω να δω Delphi και πιθανοτατα εχω χασει επεισοδια.

    Παρολα αυτα, οι τεχνικες παραμενουν τεχνικες..

    πχ modbus?



    Burn baby, burn

  3. #3
    Εξέχον μέλος
    Ημερομηνία εγγραφής
    Oct 2005
    Θέση
    Nikea, , Greece.
    Ιδιότητα:
    Απαντήσεις
    2,979
    Σιγουρα εγώ και πιθανότατα και ο Καπετάνιος θα ενδιαφέρεται.

    Και γώ έχω να χρησιμοποιήσω τη γλώσσα απο το 1995 οπότε μιλάμε για πλήρη άγνοια....



    I believe we should all pay our tax with a smile. I tried - but they wanted cash...

  4. #4
    Μέλος
    Ημερομηνία εγγραφής
    Mar 2012
    Θέση
    Athens, , Greece.
    Ιδιότητα:
    Αγνωστη
    Απαντήσεις
    99
    Πάνω που είχα αρχίσει να απογοητεύομαι.

    Όλη η αναφορά σε TCP/IP και πολυνηματικούς servers είναι παραγγελιά από τον καπετάνιο. Από τα υπόλοιπα κάποια είναι κοινά για όλες τις OO γλώσσες και κάποια ειδικά σε Win32 με Delphi.

    Υπάρχει μια μεγάλη αλλαγή στο πως γράφεις προγράμματα, σειριακά με C ή με Fortran και όταν χρησιμοποιείς objects. Αλλάζει ο τρόπος που σκέφτεσαι. Το ισοδύναμο που μπορώ να βρω είναι τα κλειστά κουτιά στα ΣΑΕ, με συγκεκριμένους εισόδους, λειτουργικότητα (συνάρτηση μεταφοράς) και εξόδους.
    Πολλά τέτοια κουτιά, συνδεδεμένα μεταξύ τους υλοποιούσαν το σύστημα.


  5. #5
    Μέλος
    Ημερομηνία εγγραφής
    Mar 2012
    Θέση
    Athens, , Greece.
    Ιδιότητα:
    Αγνωστη
    Απαντήσεις
    99
    1. Κλάση & αντικείμενα
    Aντικειμενοστρεφής προγραμματισμός είναι η διαδικασία σχεδίασης και υλοποίησης προγραμμάτων με βασική μονάδα την κλάση. Γνώρισε αποδοχή γιατί η M$oft, στα μέσα της δεκαετίας του 90, έβγαλε ένα πολύ καλό C++ compiler και προώθησε την C++ σαν γλώσσα για το COM, η Sun διέθεσε την Java σαν open source και η Borland προσπάθησε να λάμψει ξανά βγάζοντας στην αγορά σαν VB killer, το Delphi.

    Η κλάση (class) είναι μία προδιαγραφή / ένα πρότυπο και δηλώνει την συμπεριφορά ή την λειτουργικότητα που μπορεί να παράσχει. Έχει ενσωματωμένα χαρακτηριστικά (μνήμη), ορατά ή όχι στους χρήστες της. Επιπλέον εκτελεί ενέργειες (μεθόδους), που χρησιμοποιούν την εσωτερική μνήμη και υλοποιούν την λειτουργικότητα της.

    Έχει τέσσερα βασικά χαρακτηριστικά

    Abstraction : επιτρέπει την δημιουργία αφαιρετικών μοντέλων
    Encapsulation: συνδέει δεδομένα και λειτουργίες.
    Κληρονομικότητα (Inheritance) : είναι η δυνατότητα μιας κλάσης να κληρονομήσει δεδομένα και μεθόδους μιας άλλης προγενέστερης κλάσης.
    Πολυμορφισμός (Polymorphism): η δυνατότητα μιας κλάσης να κληρονομήσει και να μεταβάλει τις συμπεριφορές μιας άλλης ανώτερης κλάσης.

    Κάθε κλάση ορίζει μία μέθοδο δημιουργίας (constructor) μέσω της οποίας δημιουργούνται αντικείμενα. Το αντικείμενο υλοποιεί τις ιδιότητες του προτύπου (class).

    Τα αντικείμενα αλληλεπιδρούν και ανταλλάσουν δεδομένα μεταξύ τους για να δημιουργήσουν τελικά ένα πρόγραμμα.

    Στο Delphi τα objects δημιουργούνται πάντα δυναμικά και η αναφορά τους είναι ένας pointer. Ο compiler εξάλειψε την ανάγκη της χρήσης του ^ κατά την χρήση των objects.

    Ορίζει επιπλέον και μία μέθοδο καταστροφής (destructor) του αντικειμένου που καλείται όταν παύει να χρησιμοποιείται και αποδεσμεύσει την μνήμη που χρησιμοποίησε..

    Ας δούμε την κλάση ΤStream. http://delphi.about.com/od/vclusing/l/aa110803a.htm
    Το TStream είναι αφηρημένο και ανύπαρκτο. Οι κλάσεις TMemoryStream και TFileStream, που κληρονομούν τις ιδιότητες του, υλοποιούν την δυνατότητα να διαβάζουνε ή να γράφουνε σε μνήμη ή σε αρχείο αντίστοιχα.

    Στο http://www.swissdelphicenter.ch/torr...ode.php?id=822 δέστε την δήλωση της procedure CompressStream(inpStream, outStream: TStream);
    Διαβάζει δεδομένα από ένα stream στην μνήμη, τα συμπιέζει στην μνήμη και τα γράφει σε ένα άλλο stream.

    Μια πρώτη προφανής βελτίωση είναι η απευθείας χρήση TFileStream που λειτουργεί απευθείας με αρχεία και δεν απαιτεί να διαβάζουμε πρώτα το περιεχόμενο στη μνήμη (x 1) να το αντιγράφουμε στην μνήμη (x2) να το συμπιέζουμε στην μνήμη (x 3) και στην συνέχεια να το γράφουμε στο δίσκο.

    var fs1, fs2: TFileStream;
    begin
    fs1 := nil;
    fs2 := nil;
    try
    fs1:=TFileStream.Create('c:\fs1.dat',fmOpenRead or fmShareExclusive);
    fs2:=TFileStream.Create('c:\fs2.dat',fmOpenWrite or fmCreate);
    CompressStream(fs1, fs2);
    finally
    fs2.Free;
    fs1.Free;
    end;
    end;

    Στο http://pages.cs.wisc.edu/~rkennedy/vmt αναλύεται πως επιτυγχάνεται πολυμορφισμός και μπορούμε να δηλώνουμε την Compress με ορίσματα τύπου TStream και να την χρησιμοποιούμε με ορίσματα τύπου TMemoryStream & TFileSTream.

    Τι χρειάζεται ώστε ένα TFilestream να μπορεί να συμπιέζει όταν γράφει ή αντίθετα ?
    http://www.koders.com/delphi/fidD3C8...B9D.aspx?s=zip μας απαντάει το ερώτημα.

    Πως αναγνωρίζουμε objects, μεθόδους και χαρακτηριστικά (attributes/properties).
    Ξεκινάμε με μία σύνοψη που περιγράφει το πρόβλημα. Τα ουσιαστικά, είναι υποψήφια objects. Αν υπάρχουν και στην πραγματικότητα τότε τα σιγουρεύουμε.
    Οι ιδιότητες ή τα χαρακτηριστικά τους είναι attributes (μνήμη) και οι μέθοδοι απαντούν σε μηνύματα και επενεργούν στη μνήμη του object.

    Στις 16 Σεπτεμβρίου 1998 οι Rolling Stones εμφανίστηκαν στο ΟΑΚΑ.
    Είχα δουλέψει με τον PCL (πρόκειται μάλλον για επαγγελματική διαστροφή να αναφέρεσαι σε φίλο με το user name) για την προετοιμασία του λογισμικού υποστήριξης της συναυλίας.
    Το project αφορούσε 2 συναυλίες, στο ΟΑΚΑ και στο Λιμάνι στην Θεσσαλονίκη.

    Τα εισιτήρια της συναυλίας ήταν προτυπωμένα με ολόγραμμα και barcode, σε αριθμημένα μπλοκάκια των 100 εισιτηρίων. Η εταιρεία …. ανέλαβε την διάθεση των εισιτηρίων και μέσω του call center της, επέτρεπε την κράτηση θέσεων σε διαφορετικές ζώνες του γηπέδου και με διαφορετική τιμή, πληρωμή με πιστωτική κάρτα, εμφακέλωση των εισιτήριων, αποστολή στους παραλήπτες, επικοινωνία και επαναποστολή σε περίπτωση αποτυχίας παράδοσης και τελικά έλεγχο του εισιτηρίου (μέσω του barcode) κατά την είσοδο στο γήπεδο.

    Αναφέρω κάποιες κλάσεις που προκύπτουν από αυτή τη μικρή περιγραφή.
    1. Το Venue (θέατρο, γήπεδο) που χωρίζεται σε θύρες/ζώνες. Κάθε θύρα έχει θέσεις, αριθμημένες ή όχι (αγωνιστικός χώρος) και μία τιμή.
    2. Η παράσταση (Show), με την ημερομηνία, περιγραφή και το γήπεδο/θεάτρο.
    3. Το block των εισιτηρίων με αναφορά σε ζώνη, τιμή εισιτηρίου και από-έως αριθμό εισιτηρίου.
    4. Τα εισιτήριά που αντιστοιχούν σε θέση
    5. Ο θεατής, με την διεύθυνση του, τον αριθμό της κάρτας του.
    6. Την κράτηση ενός θεατή, με ημερομηνία κράτησης, παράσταση, ζώνη, αριθμό θέσεων και κόστος.
    7. Τις θέσεις μιας κράτησης.

    Η θέση του γηπέδου πρέπει να είναι μία κλάση και κάθε θέση ένα object ? (Υπάρχουν σπασμένες θέσεις ?)

    Κάθε κλάση μπορεί να αποτελείται από άλλες (πχ Γήπεδο, θύρα, θέση) ή να συνδέεται με κάποια άλλη (πελάτης με κράτηση).

    Οι κλάσεις αυτές αναφέρονται σαν PDC (Problem Domain Components).

    Το αποτέλεσμα. http://www.tanea.gr/oikonomia/article/?aid=4034166
    Εγώ πήγα αυθημερόν στις Βρυξέλες και είδα τον Larry Elison να μιλάει για το όραμα της Oracle αντί να ακούσω το Angie.

    Πως αναγνωρίζουμε τις μεθόδους
    Είναι οι λειτουργίες μια κλάσης. Ξεκινούμε από τις βασικές λειτουργίες και καταλήγουμε στις ειδικές .

    Έστω ότι έχουμε την παρακάτω κλάση

    TSex = (sxMale,sxFemale);

    TMammal = class
    private
    fAge : double;
    fWeight:double;
    fHeight:double;
    fSex:TSex;
    public
    constructor Birth;
    destructor Die;
    procedure Sleep;
    procedure Work;
    procedure Eat;
    property Age : double read fAge write fAge;
    property Weight:double read fWeight write fWeight;
    property Height:double read fHeight write fHeight;
    property Sex:TSex read fSex write fSex;
    end;

    THuman = class(TMammal)
    public
    procedure Vote;
    end;

    Είναι βέβαιο ότι ο καθένας θα μπορούσε να προσθέσει και πολλές άλλες λειτουργίες και χαρακτηριστικά. Η κλάση είναι μια προδιαγραφή. Επεκτείνεται και μεταβάλλεται.
    Στην κορυφή της κληρονομικής ιεραρχίας έχουμε πάντα τις γενικές λειτουργίες και προχωρώντας προς τα φύλλα καταλήγουμε στην εξειδίκευση των λειτουργιών.

    Οθόνη καταχώρησης – απεικόνισης
    Στη συνέχεια πρέπει να σχεδιάσουμε τις οθόνες για την καταχώρηση των χαρακτηριστικών κάθε κλάσης - οντότητας. Οι ΑΠΛΕΣ οθόνες έχουν λίγα πεδία και λίγα χρώματα και χρησιμοποιούν ένα font χωρίς υπερβολές. Το απλό είναι δύσκολο.

    Οι ανάγκες της εμφάνισης των δεδομένων είναι ανεξάρτητες από τα χαρακτηριστικά της κλάσης . Θα δημιουργήσουμε μία φόρμα για κάθε κλάση που θέλουμε να ενημερώσουμε.

    Οι φόρμες κλάσεις αναφέρονται σαν HIC (Human Interaction Components). Το βρίσκω ισοδύναμο με τις HMI οθόνες /συσκευές που εμφανίζουν τα δεδομένα που συλλέγει το plc.

    Για το γήπεδο θα υπάρχει η ΤVenueForm με γραφικά και δυνατότητα επιλογής θύρας.
    Η φόρμα θα δέχεται δεδομένα, θα τα ελέγχει για ορθότητα, και θα δημιουργεί μια PDC και ενημερώνει τα πεδία της.

    Πως από την κλάση πάμε στη database ?
    «Υπάρχει η Oracle και text files». Το είχε πει πριν από χρόνια, το 1998, ο Βασίλης και παραμένει δυστυχώς αλήθεια. Από την άλλη η M$oft με τον sqlserver δημιούργησε την db για τις μάζες. Έγραφες ένα select * from table και τα αποτελέσματα εμφανιζόταν σε ένα εξαιρετικό εργαλείο. Κανένας δεν νοιαζόταν για performance και ότι οι writers μπλοκάρουν τους readers.

    Αρχικά αντιστοιχούμε κάθε κλάση σε ένα πίνακα. Κάθε πίνακας πρέπει να έχει πρωτεύον κλειδί. Χρησιμοποιούμε, ένα χαρακτηριστικό που είναι μοναδικό (πχ ΑΦΜ σε πελάτες) ή ένα κρυφό τεχνητό κλειδί (surrogate key). Επιλέξτε ένα μικρό κλειδί (ένα 32 bit integer). Μην χρησιμοποιείτε Guids. Σταματήστε την άσκοπη χρήση χώρου και υπολογιστική ικανότητας.
    Οι πίνακες συνδέονται μεταξύ τους με κλειδιά (Foreign Keys). Χρησιμοποιήστε τα. Δηλώστε στη βάση όλους τους κανόνες ή περιορισμούς (constraints) που ορίζονται για το δεδομένα σας.

    Η DMC κλάση (Data Management Component) επικοινωνεί με μία PDC κλάση και παράγει τις κατάλληλες SQL εντολές για να ενημερώσει την database.

    H DMC κλάση «τρέχει» δίπλα στην database, παράγει 1..Ν sql εντολές και μέσω του database client (Oracle OCI ή M$oft dblib) τις στέλνει με TCP/IP προς εκτέλεση στον database server.
    Οι καταχωρήσεις στην βάση γίνονται πάντα σε επίπεδο οντότητας και να προστατεύεται η ακεραιότητα των δεδομένων χρησιμοποιούνται transactions.
    Τα transactions έχουν ΑΥΣΤΗΡΑ μικρή διάρκεια. Δηλαδή, δεν εμφανίζουμε ερωτήσεις ενώ έχουμε ξεκινήσει ένα transactions ή δεν εκτυπώνουμε μέσα σε transaction.

    Αποφεύγουμε τα deadlocks. Αν σε ένα ενεργό transaction ενημερώνουμε τις εγγραφές με PK A και Β και σε ένα δεύτερο ταυτόχρονο transaction τις B και Α τότε το ένα transaction θα κλειδώσει το άλλο.

    Κάποια στιγμή μου ζητήσανε βοήθεια για ένα πρόβλημα deadlock που εμφανιζόταν σε μία Oracle. Δύο σταθμοί καταχωρούσαν μεγάλες παραγγελίες και που & που κωλούσαν.
    Ρώτησα αν ταξινομούσαν τις γραμμές τις παραγγελίας πριν την καταχώρηση.

    Client Server ή 3 Tier
    Η εφαρμογή μας περιέχει τις HIC, PDC & DMC κλάσεις και τρέχει σένα PC. Ένα δίκτυο 100 Mbits μας συνδέει με την βάση δεδομένων. Όταν λοιπόν εισάγουμε στην οθόνη 1 κράτηση με 100 θέσεις θα πρέπει να την καταχωρήσουμε στην βάση με χρήση 101 εντολών “insert into table column list values list” μέσα σε ένα begin transaction & commit transaction.

    Τι γίνεται όταν η εφαρμογή μας τρέχει στην Κομοτηνή και η database είναι στον Άγιο Στέφανο. Θα πρέπει η εφαρμογή μας να σπάσει σε HIC & PDC που «τρέχουν» στην Κομοτηνή και το DMC να βρεθεί δίπλα στην database στον Άγιο Στέφανο.

    Η διαχειριστική εφαρμογή δέχεται ή παράγει δεδομένα, σχηματίζει ένα μήνυμα με αυτά (κωδικοποιημένο πιθανά σαν xml) και το στέλνει στο PDC στο Άγιο Στέφανο.
    Εκεί, ένας xml to sql maper http://stackoverflow.com/questions/1...to-sql-mapping καταχωρεί τα δεδομένα στην βάση δεδομένων και ενημερώνει τον χειριστή για την επιτυχία / αποτυχία της καταχώρησης.

    «Στέλνει το μήνυμα στον Αγιο Στέφανο». Ποιος όμως το παραλαμβάνει ?

    Application Server
    Μιλάμε για έναν application server, αν χρησιμοποιούμε δικά μας μηνύματα ή ένα Web Server που υποστηρίζει http πρωτόκολλο (internet) με xml περιεχόμενο.

    Ξαφνικά ένας open source Apache Web Server μπορεί άνετα να χρησιμοποιηθεί (ξέρω, έχουμε φύγει λίγο από το Delphi).

    Ti κοινό έχουν ένας application Server, o Web Server και ο database server. Ακούνε σε μία πόρτα για συνδέσεις, δέχονται πολλαπλές συνδέσεις μέσω TCP/IP από πελάτες που ξέρουν να τους μιλήσουν, δημιουργούν ένα ανεξάρτητο νήμα (thread) εξυπηρέτησης κάθε σύνδεσης και ανταλλάσουν μηνύματα με το πελάτη για όσο διάστημα διαρκεί η σύνδεση.

    Ένας Delphi application server δέχεται custom μηνύματα, και στο thread του πελάτη (Κομοτηνή) δημιουργεί το κατάλληλο PDC object που μεταφράζει το μήνυμα σε sql και τα καταχωρεί στην βάση. Ένας Apache δέχεται http μηνύματα, αποσπά το xml και μέσω php το καταχωρεί στην βάση. Ένας database server, δέχεται μηνύματα μέσω του database client, και μπορεί να εκτελέσει sql εντολές.

    The Delphi Way
    Το Delphi προχώρησε ένα βήμα παραπάνω επεκτείνοντας την γλώσσα Pascal ώστε η γραμματική της να επιτρέπει την δήλωση κλάσεων και πρόσθεσε ένα εξαιρετικά παραγωγικό και γρήγορο περιβάλλον εργασίας για την δημιουργία προγραμμάτων. Υποστήριξε μάλιστα και κληρονομικότητα στις φόρμες της εφαρμογής. Με χρήση data aware components μπορείς, ξεχνώντας όλα τα παραπάνω, να μεταβάλεις απευθείας τα δεδομένα της βάσης.
    Tragic.
    Όλοι μπορούσαν να φτιάξουν πολύ γρήγορα διαχειριστικές ή άλλες εφαρμογές. Χωρίς ανάλυση ή μεθοδολογία. Η κάθε φόρμα, έβλεπε τις υπόλοιπες, ο κώδικας χειρισμού της οθόνης, έμπλεκε με τους υπολογισμούς και με την αποθήκευση/ανάκληση από τον βάση δεδομένων. Μια μεταβολή σε κάτι φαινομενικά απλό επιδρούσε σε κάτι άσχετο.

    Ρίξτε μια ματιά σε ένα τελευταίο σας project. Μετρήστε τις απλές ρουτίνες, έξω από objects και τις global μεταβλητές. Τι θα σας προσφέρουν τα objects. Δυσκολότερη αρχική υλοποίηση (χρειάζεται σκέψη), ευκολότερη συντήρηση, μεγαλύτερη επεκτασιμότητα λιγότερα bugs.

  6. #6
    Εξέχον μέλος
    Ημερομηνία εγγραφής
    Jun 2008
    Θέση
    Glyfada, , Greece.
    Ιδιότητα:
    Αγνωστη
    Απαντήσεις
    3,101
    Μιας και γράφω από pda διότι:
    «πρώτο καλοκαίρι μετά από 18 χρόνια που δεν πήρα το portable παραμάσχαλα στις διακοπές, άρα Νίκη μεγάλη...»
    θέλω να πω ένα μπράβο στον pfys για την ανάπτυξη αυτή που δείχνει ότι μπήκε με 1000 στο OOP, αλλά ταυτόχρονα και το επικήδειο ρέκβιεμ για μια πολύ μεγάλη γλώσσα προγραμματισμού την οποία πεθάνανε με το ζόρι προς δόξα άλλων όχι αναγκαστικά καλύτερων...

    Του αφιερώνω αυτό από τον καιρό του 1993 όταν διάβαζα όλες αυτές τις στρυφνές έννοιες μόνος και δίχω δάσκαλο...
    OOP & Ελληνική γλώσσα σε όλο της το μεγαλείο

    και το παρατηρείστε το ωραιότερο:
    Προς Αμερικανούς αναγνώστες: Τι σημαίνει Polymorphism...
    Polymorphism is Greek "for many shapes" and it is just that: a way of giving an action...

    Τι σημαίνει Πολυμορφία;
    Για τους Έλληνες δεν χρειάζεται ιδιαίτερη εξήγηση τι σημαίνει πολυμορφία. Από πολλές πηγές μας αν ανατρέξουμε π.χ. στο δωδεκάθεο θα δούμε ότι οι Θεοί έπαιρναν συνήθως διαφορετικές μορφές στην επικοινωνία τους με τους θνητούς. Μπορούμε να πούμε ότι είχαμε πολύμορφους θεούς κι απ' ότι φαίνεται αυτή η ιδιότητα άρεσε στον κόσμο.
    Για τα Delphi objects η πολυμορφία είναι μία ζηλευτή ιδιότητα όπου επιτρέπει στο ίδιο αντικείμενο με τα κοινά χαρακτριστικά π.χ. στη γάτα κλάσης TGata να περιέχει μία ακόμη ιδιότητα π.χ. KaloGataki η οποία είναι τύπου TKaloGataki ο οποίος παίρνει π.χ. τις τιμές: kgGourgourizon, kgKakistro, kgGriniazon, kgKleftizon
    Συνεπώς το ίδιο το object που περιγράφει μια γάτα, μπορεί να συμπεριλάβει πολλούς τύπους γατιών διότι encapsulates εκτός των άλλων π.χ. χρωματισμών τριχώματος, χρωματισμό ματιών κλπ. μία ακόμα ιδιότητα που είναι τύπου «καλό γατάκι».
    Από κει και μετά έρχεται η κληρονομικότητα η οποία σου επιτρέπει να φτιάξεις μία άλλη κλάση γάτας πχ την TSiamGata η οποία είναι κλάσης TGata και επομένως μονομιάς κληρονομεί όλες τις ιδιότητες αυτής επομένως και την KaloGataki. Ταυτόχρονα επιτρέπει στον προγραμματιστή να προσθέσει στη νέα κλάση ιδιότητες που δεν βλέπει η πρόγονη κλάση. Για παράδειγμα την ιδιότητα:
    Oura τύπου TOura ο οποίος παίρνει τις τιμές: gStraviOura, gHorisOura, gNormalOura

    Περιττό να προσθέσω ότι η ιδέα των objects είναι απόρροια των φοβερών records της Pascal. Το ηλιακό μου πρόγραμμα βασίσθηκε σε 3 τέτοια records που δόμησα όπως TSunData, THliakosStruc, TBoilerStruc. Για παράδειγμα η θερμοκρασία εξόδου από τον συλλέκτη είναι ιδιότητα του THliakosStruc ή η θερμοκρασία εισόδου στον εναλλάκτη του boiler είναι ιδιότητα του TBoilerStruc

    Δυστυχώς όμως.... Σ' αυτόν τον κόσμο τον κακό, τον χιλιομπαλλωμένο, ό,τι καλό πεθαίνει!


    Φευγάτος Πειρατής


    Στίγμα Μαστροκαπετάνιου

  7. #7
    Μέλος
    Ημερομηνία εγγραφής
    Mar 2012
    Θέση
    Athens, , Greece.
    Ιδιότητα:
    Αγνωστη
    Απαντήσεις
    99
    Πραγματικός κόσμος
    Θέλω να βάλω ένα καλοριφέρ στο σπίτι μου. Πέντε σωματάκια και ένα μπόιλερ θα βάλω. Έχω μάστορα διαμάντι. Γιατί να πληρώσω τον μηχανολόγο ?

    Ακούγεται γνώριμο ?. Ισχύει παντού. Η μεθοδολογία υπάρχει και αν θέλουμε την χρησιμοποιούμε. «Τι έχεις καρδιά μου και αναστενάζεις. Το κεφάλι τα κάνει το κεφάλι τα τραβάει» όπως μου έλεγε, από μικρό, ο πατέρας μου.

    Έστω ότι πρέπει να καταχωρήσουμε τα στοιχεία ενός πελάτη σύμφωνα με την μεθοδολογία. Έχουμε ετοιμάσει την PDC κλάση ΤCustomer που περιγράφει το τι είναι ο πελάτης.


    TCustomer = class
    private
    FCUSTID:Integer;
    FFNAME:String;
    FLNAME: String;
    FLASTPICKUP: String;
    FAFM: String;
    FADDRSTR: String;
    FADDRNUM: String;
    FADDRZIP: String;
    FADDRCITY: String;
    FTEL1: String;
    FTEL2: String;
    FCOMPANY: String;
    FPROFESSION: String;
    FDOY: String;
    Protected
    // δημιουργεί νέα Ιd για τον πελάτη
    procedure SetCustId(value:integer);
    // Ελέγχει αν το ΑΦΜ που καταχωρούμε είναι σωστό.
    procedure SetΑFM(const value:string);

    public
    Property CUSTID:Integer read FCustId write SetCustId;
    Property FNAME:String read FFName write FFname;
    Property LNAME:String read FLName write FLname;
    Property AFM:String read FAFM write SetAFM;
    ...
    End;

    Έχουμε ετοιμάσει και την DMC κλάση
    TDMCustomer =class(ΤCustomer)
    Public
    // Δημιουργεί ένα πελάτη και ανακαλεί τα στοιχεία του από την βάση.
    Constructor Create(ID:integer);
    Procedure Save;
    Procedure Update;
    End;

    Έχουμε σχεδιάσει την οθόνη καταχώρησης

    https://picasaweb.google.com/1078235...03951973481138

    Η TCustForm επικοινωνεί με την ΤCust για να εμφανίσει ή να μεταβάλει τα στοιχεία ενός πελάτη. Η TCust με την TDMCust για να ανακαλέσει ή να αποθηκεύσει τα δεδομένα στην βάση δεδομένων.

    Ας δούμε τις «ευκολίες» του Delphi. Τα data aware components επιτρέπουν

    1. Την σύνδεση με πίνακα της βάσης και ορισμό των χαρακτηριστικών της γιαλαντζί κλάσης, από όλα τα πεδία της βάσης.
    2. Την δυνατότητα μεταβολής των δεδομένων
    3. Την αυτόματη ενημέρωση της βάσης.

    Ας αφήσουμε τις διαχειριστικές εφαρμογές και ας δούμε την εφαρμογή του πειρατή.



    Τα ουσιαστικά δηλώνουν τα objects. Πολύ περισσότερο όταν υπάρχουν και φυσικά. Τα ρήματα δηλώνουν μεθόδους/λειτουργίες.

    Ο ήλιος ακτινοβολεί συγκεκριμένη ενέργεια ανάλογα με την περιοχή και την ώρα.

    TSunEnergy = class
    Public
    Function EnergyFlowouble; // ακτινοβολεί..
    Property Month
    Property Day
    End;

    Ο ηλιακός συλλέκτης αποφορά την ενέργεια, και την μετατρέπει σε θερμική

    TSolarPanel = class
    public
    property Slope :double; //κλίση
    property SouthDeviation:double; // Απόκλειση από τον Νότο
    property Surface:double; // συλλεκτική επιφάνεια
    property Flow:double; // Lt/h
    property GlycolePerc : double;
    end;

    Το boiler μέσω του εναλλάκτη για τον ηλιακό, ζεσταίνει το νερό που περιέχει

    ΤBoiler = class
    public
    property Volume:double;
    property AverageDaylyConsuption:double;
    property WaterTemperature:double;
    property SolarHeatExchangeSurface :double; // m2
    end;

    H κλάση TCalculator υπολογίζει
    ένα σύνολο τιμών,

    για μία ημερομηνία aDate,
    από ώρα FromTime έως ToTime με βήμα step λεπτά
    για τον συλλέκτη aSolarPanel
    και το boiler aBoiler.


    TCalculator = class
    procedure Calc(aDate:TDate; // για συγκεκριμένη ημερομηνία
    FromTime, ToTime:TTime; step: integer;
    aSolarPanel:TSolarPanel;
    aBoiler:TBoiler);
    property CalcCount:integer;
    property Time[index:integer]:TTime; //
    property SunHeight[index:integer]:degrees;
    property SunAzimou8io [index:integer]:degrees;
    property BoilerTemp [index:integer]:double;
    property CollectorTempIn [index:integer]:double;
    property CollectorTempOut [index:integer]:double;
    ...
    end;


    Τα αποτελέσματα εμφανίζονται στην οθόνη

    For i:=0 to Calculator.CalcCount do
    begin
    Grid[0,i]:= FormatTime(Calculator.Time[i]);
    Grid[1,i]:= FormatDegrees(Calculator.SunHeight [i]);
    Grid[2,i]:= FormatDegrees(Calculator.SunAzimou8io [i]);
    Grid[3,i]:= Format('%.1f',[Calculator.BoilerTemp [i]]);
    Grid[4,i]:= Format('%.1f',[Calculator.CollectorTempIn[i]]);
    Grid[5,i]:= Format('%.1f',[Calculator.CollectorTempOut[i]]);
    ...
    End;

    κάθε κλάση ορίζεται σε ξεχωριστό unit. Η φόρμα γνωρίζει μόνο τον Calculator.


    Εδώ, συνάδελφοι μηχανολόγοι, χρειάζομαι την βοήθεια σας για το ολοκληρώσουμε το μοντέλο. Χρειάζομαι τις προτάσεις σας για τα επιπλέον χαρακτηριστικά των κλάσεων και τις μεθόδους/υπηρεσίες που παρέχουν.

    ΥΓ.
    1. Εγραφα και αφου τελείωσα είδα την απάντηση του πειρατή. Προκύπτει απόλυτη σύμπτωση στην ανάλυση. Μπορεί να τον καταφέρω να το ξαναγράψει με objects

    2. Περίμενα οτι θα υπήρχαν κάποιοι, που θα διαφωνούσαν με τον ορισμό του THuman με μόνο λειτουργία την ψήφο. Υπήρχαν άλλες πολύ πιο σημαντικές (Ερωτας, διανόηση, επικοινωνία). [:0]


  8. #8
    Μέλος
    Ημερομηνία εγγραφής
    Mar 2012
    Θέση
    Athens, , Greece.
    Ιδιότητα:
    Αγνωστη
    Απαντήσεις
    99
    quote:
    «πρώτο καλοκαίρι μετά από 18 χρόνια που δεν πήρα το portable παραμάσχαλα στις διακοπές, άρα Νίκη μεγάλη...»
    Δεν φαντάζομαι, η μεγάλη Νίκη να είναι κάποια παλιά συμμαθήτρια ? [:I]

  9. #9
    Εξέχον μέλος
    Ημερομηνία εγγραφής
    Jun 2008
    Θέση
    Glyfada, , Greece.
    Ιδιότητα:
    Αγνωστη
    Απαντήσεις
    3,101
    quote:Δεν φαντάζομαι, η μεγάλη Νίκη να είναι κάποια παλιά συμμαθήτρια ?
    Πάλι θα απαντήσω από pda γιατί «ξέρεις να με προκαλείς»...
    1. Η Νίκη η συμμαθήτρια πάει, χάθηκε! Και καλύτερα που χάθηκε για να μη με δει έτσι όπως με κατάντησε το άλλο μου πάθος (δείγμα παραπάνω) με την 25χρονη παραμονή μου σε καρέκλα μπροστά από τον δαίμονα που λέγεται PC. Εκτοξεύθηκε ο νους και γκρεμοτσακίσθηκε το σώμα! Συν 60 κιλά! Καλύτερα να μη με δει η Νίκη διότι θα χάσει πάσα ιδέα για τον γνώριμό της και πολυαγαπημένο συμφοιτητή που ήξερε να την ταξιδεύει δίχως τα objects της Pascal μιας και τότε δεν τα γνώριζα καν.
    ΠΡΟΣΟΧΗ λοιπόν σε σας τους νεώτερους. Πρώτα το σώμα και μετά ο νους! Καμία γνώση δεν είναι αυτοσκοπός όσο και να μας καταξιώνει. Άλλωστε εμείς οι Έλληνες το γνωρίζουμε καλά με το γνωστό «νους υγιής εν σώματι υγιή»
    2. Η Νίκη για την οποία μιλάω είναι κι αυτή θυλυκού γένους και θα μπορούσε να είναι μια ωραία γυναίκα για να μου κεντρίσει το ενδιαφέρον να κλείσω πλέον τον «δαίμονα». Το έχω βάλει στοίχημα με τον εαυτό μου και θα το πετύχω. Θέλω να πάρω πίσω από τα 60 κιλά όσα μπορέσω κι ας μείνουν όσα μείνουν. Ικανά όμως να έλξουν την άλλη Νίκη, την παλιά μου συμμαθήτρια

    Συνεπώς:
    quote:Μπορεί να τον καταφέρω να το ξαναγράψει με objects
    Κάνε λίγο υπομονή. Έχω τον γιο μου πρωτοετή στο ΕΜΠ σπασικλάκι κανονικό με δεκάρια κι έτσι. Και στον προγραμματισμό! Μόνο που στους Μηχανολόγους τους «αλωνίζουν» με την Fortran και έχει τα νεύρα του αν και του λέω να μάθει κι αυτήν. Έτσι κι αλλιώς στο να γράψεις κώδικα δεν μετρά η γλώσσα αυτή καθεαυτή όσο το ταλέντο σου να συνθέτεις «γλωσσικούς μηχανισμούς» οι οποίοι τρέχουν άψογα και δίχως προβλήματα.
    Θα σε φέρω σε επαφή μαζί του και φιάξτε όσα objects τραβάει η όρεξή σας. Είναι C++ακιας αλλά τον έχω πιάσει να υποκλέπτει τις συναρτήσεις του SysUtils


    Στίγμα Μαστροκαπετάνιου

  10. #10
    Μέλος
    Ημερομηνία εγγραφής
    Mar 2012
    Θέση
    Athens, , Greece.
    Ιδιότητα:
    Αγνωστη
    Απαντήσεις
    99

    Ηλεκτρονικό κατάστημα ειδών θέρμανσης και κλιματισμού

    Απαντάω από την βόρεια Εύβοια, με το άρτι αποκτηθέν Aurdino έτοιμο για πειράματα.
    quote:
    Έχω τον γιο μου πρωτοετή στο ΕΜΠ σπασικλάκι κανονικό με δεκάρια κι έτσι.
    Μάλλον ο γιος σου δεν είχε που να μοιάσει. Εύχομαι στον λεβέντη σου, κάθε επιτυχία. Ελπίζω μόνο να μην μελετάει μόνο για heat tanks αλλά να εκμεταλλευθεί στο έπακρο και το διαθέσιμο οικογενειακό think tank.

    "Αιέν αριστεύειν και υπείροχον έμμεναι άλλων, μηδέ γένος πατέρων αισχυνέμεν».
    Πάντα να είσαι πρώτος και ανώτερος από τους άλλους και να μην ντροπιάζεις τη γενιά των προγόνων. Ιλιάδα, Ζ 208

    quote:
    Μόνο που στους Μηχανολόγους τους «αλωνίζουν» με την Fortran και έχει τα νεύρα του αν και του λέω να μάθει κι αυτήν
    http://www.computer.org/csdl/mags/co...012070008.html

    quote:
    Έτσι κι αλλιώς στο να γράψεις κώδικα δεν μετρά η γλώσσα αυτή καθεαυτή όσο το ταλέντο σου να συνθέτεις «γλωσσικούς μηχανισμούς» οι οποίοι τρέχουν άψογα και δίχως προβλήματα.
    Η γλώσσα είναι το εργαλείο. Πρέπει να υποστηρίζει τις απαιτούμενες δυνατότητες. Η fortran, η C και η turbo pascal δεν υποστηρίζουν τους μηχανισμούς για να δηλώσεις κλάσεις και να υλοποιήσεις (instantiate) αντικείμενα.

    Η σύνθεση, από απλούστερα ή δομικά αντικείμενα οδηγούν σε κατασκευές, γλωσσικές ή μη, που επιλύουν ένα πρόβλημα. (bottom-up).

    Η ανάλυση, «σπάει» ένα σύνθετο αντικείμενο ή πρόβλημα, στα συστατικά του και το επιλύει επιλύοντας τα επιμέρους μικρότερα προβλήματα. (top-down)

    quote:
    Περιττό να προσθέσω ότι η ιδέα των objects είναι απόρροια των φοβερών records της Pascal. Το ηλιακό μου πρόγραμμα βασίσθηκε σε 3 τέτοια records που δόμησα όπως TSunData, THliakosStruc, TBoilerStruc. Για παράδειγμα η θερμοκρασία εξόδου από τον συλλέκτη είναι ιδιότητα του THliakosStruc ή η θερμοκρασία εισόδου στον εναλλάκτη του boiler είναι ιδιότητα του TBoilerStruc
    Συμφωνώ, αλλά παρέλειψες τις ρουτίνες που χρησιμοποιούν τα records. Αυτό που προκύπτει και από τα δύο, το object δηλαδή, λειτουργεί σαν κάτι ενιαίο. Ενσωματώνει (encapsulates) δεδομένα και υπολογισμούς.

    Επιστρέφω, στο πρόγραμμά σου γιατί αποτελεί, με δεδομένο το κοινό, το καλύτερο παράδειγμα αλλαγής από δομημένο σε αντικειμενοστρεφή προγραμματισμό.

    To εγχειρίδιο των Ηλιακών συστημάτων http://www.monachos.gr/forum/topic.asp?TOPIC_ID=3832 αποτελεί μια πολύ καλή περιγραφή των φαινομένων. (stom ευχαριστώ)

    Ο ήλιος ακτινοβολεί συγκεκριμένη ενέργεια ανάλογα με την περιοχή και την ώρα.


    Κώδικας:
    TSunEnergy = class
    
    Public
    
    // Ηλιακή ενέργεια στο συγκεκριμένο GeoPlatos, ημέρα και ώρα σε W/m2
        function Energy:Double; overload; 
    // με μεταβλητή την ώρα σε W/m2
        function Energy(aTime:integer):Double; overload; 
    
        property Time:integer; // seconds since midnight
        property Month:integer;
        property Day:integer;
        property GeoPlatos:double;
        property SunPerc:double;// Συντελεστής ηλιοφάνειας
    End;
    Η ροή ενέργειας είναι το μόνο στοιχείο της ηλιακή ακτινοβολίας που ενδιαφέρει ένα panel. Τα υπόλοιπα στοιχεία είναι παράμετροι που χρειάζονται για τον υπολογισμό της ροής ενέργειας.

    Η δήλωση της κλάσης γίνεται στο ανεξάρτητο uSunEnergy.pas


    Ο ηλιακός συλλέκτης αποφορά την ενέργεια, και την μετατρέπει σε θερμική μέσω του ρευστού του κλειστού κυκλώματος.

    Κώδικας:
    TSolarPanel = class
    public
    
        function Energy(EnergyIn):double; // συνολική για όλη την επιφάνεια kWh
        function Flow:double;    // ροή Lt/h
    
        property SolarAbsorbtion:double; // ποσοστό απορρόφησης ηλιακής ενέργειας
        property Slope :double; //κλίση ηλιακού
        property SouthDeviation:double; // Απόκλειση από τον Νότο
        property Surface:double; // εμβαδόν συλλεκτικής επιφάνειας
    
        property Efficiency:double; // απόδοση ηλιακού
    
        property GlycolePerc : double;
        property WaterInTemperature:double;  // θερμ. εισόδου κλειστού κυκλώματος
        property WaterOutTemperature:double; // θερμ. εξόδου κλειστού κυκλώματος
    
    end;
    H TSolarPanle.Energy δέχεται σαν παράμετρο την εισερχόμενη ενέργεια και υπολογίζει την αποδιδόμενη ενέργεια. Η ώρα της ημέρας είναι παράμετρος της TSunEnergy και όχι του panel.


    Η δήλωση της κλάσης γίνεται στο ανεξάρτητο uSolarPanel.pas

    Το boiler μέσω του εναλάκτη για τον ηλιακό ή του εναλάκτη για τον λέβητα ή την ηλεκτρική αντίσταση, ζεσταίνει το νερό που περιέχει

    Κώδικας:
    THeatSource = (hsSolarPanel, hsBurner, hsElectricity)
    
    ΤBoiler = class
    
    public
    
    // κάνω την παραδοχή οτι μόνο μία πηγή ενέργειας τροφοδοτεί το boiler
    
        function Heat(inEnergy:double; from:THeatSource):double; // στιγμιαία ισχύς Kw
    
        function AccumulatedEnergy:double; // από το περιεχόμενο ζεστό νερό Kwh
    
        function SolarFraction:double; // ποσό ενέργειας απο ηλιο / ποσό ενέργειας κατανάλωσης
    
        property WaterVolume:double;
        property AverageDayConsuption:double; // lt 
        property WaterInTemperature:double;    // ανάλογα με την εποχή.
        property WaterOutTemperature:double;  // ανάλογα με την εποχή.
    
        property SolarHeatExchangeSurface :double;   // m2
        property BurnerHeatExchangeSurface :double; // m2
    
    end;
    To boiler συσσωρεύει θερμότητα και αποδίδει λίτρα ΖΝΧ σε συγκεκριμένη θερμοκρασία στην μονάδα του χρόνου.

    Η δήλωση της κλάσης γίνεται στο ανεξάρτητο uBoiler.pas


    Όλα τα objects σχεδιάστηκαν για να δίνουν στιγμιαίες τιμές. Για να παράξουμε τα διαγράμματα ακτινοβολίας θα πρέπει να καλέσουμε την TSunEnergy.Energy(aTime) με όρισμα χρόνους που διαφέρουν μεταξύ τους κατά 15 min.

    H κλάση TCalculator γνωρίζει όλα τα παραπάνω αντικείμενα (TSunEnergy, TSolarPanel, ΤBoiler) βλέπει (uses) τα uSunEnergy.pas, uSolarPanel.pas, uBoiler.pas και υπολογίζει

    ένα σύνολο τιμών,

    για μία ημερομηνία aDate,
    από ώρα FromTime έως ToTime με βήμα step λεπτά
    για τον συλλέκτη aSolarPanel
    και το boiler aBoiler.

    Κώδικας:
    TCalculator = class
    
        procedure Calc(aDate:TDate; // για συγκεκριμένη ημερομηνία
                       FromTime, ToTime:TTime; step: integer;
                       aSolarPanel:TSolarPanel;
                       aBoiler:TBoiler);
        property CalcCount:integer;
        property Time[index:integer]:TTime; //
        property SunHeight[index:integer]:degrees;
        property SunAzimou8io [index:integer]:degrees;
        property BoilerTemp [index:integer]:double;
        property CollectorTempIn [index:integer]:double;
        property CollectorTempOut [index:integer]:double;
    ...
    end;
    Στο επόμενο post θα αναφερθώ στα threads, την βασική οντότητα που εκτελεί το CPU.


Δικαιώματα απάντησης

  • You may not post new threads
  • ΔΕΝ έχετε το δικαίωμα απάντησης
  • You may not post attachments
  • ΔΕΝ μπορείτε να επεξεργαστειτε τις απαντησεις σας
  •  
  • BB code is Ανοικτό
  • Smilies are Ανοικτό
  • [IMG] code is Ανοικτό
  • [VIDEO] code is Κλειστό
  • HTML code is Κλειστό