Ν. Πεταλίδης Τύπος Α Ιανουάριος 2016 Τεχνολογία Λογισμικού Τύπος Α Οδηγίες Αρνητική βαθμολογία δεν υπάρχει Τα θέματα επιστρέφονται Φροντίστε να είστε σύντομοι και περιεκτικοί στις απαντήσεις σας
Τεχνολογία Λογισμικού Τύπος Α Σελ. 2 / 8 1. (1 Μονάδες) Έχετε να γράψετε μια εφαρμογή για κινητό Android η οποία θα συνδέεται με έναν backend server και με κλήσεις REST. Η εφαρμογή θα στέλνει πληροφορίες για τη θέση του χρήστη, και θα παίρνει πίσω πληροφορίες ιστορικής σημασίας για την περιοχή που βρίσκεται ο χρήστης. Δε γνωρίζετε ακόμα αν θα υπάρχει ενδιαφέρον στην αγορά από την εφαρμογή και οι τέσσερες προγραμματιστές της ομάδας σας, αν και γνωρίζουν καλά HTML5, Javascript και βάσεις δεδομένων εντούτοις έχουν μικρή εμπειρία από τα υπόλοιπα frameworks που θα χρησιμοποιηθούν (δηλαδή Hibernate, Spring κτλ). Εσείς πρέπει να προτείνετε ένα σχέδιο εκδόσεων στο αφεντικό σας διάρκειας 4 μηνών, ακολουθώντας τις επιταγές των ευέλικτων μεθοδολογιών. Ποιο από τα παρακάτω σχέδια προσεγγίζει καλύτερα τη φιλοσοφία των ευέλικτων μεθοδολογιών; Αʹ. Έμφαση στη δημιουργία του μοντέλου της βάσης της εφαρμογής, έστω και αν όχι σε πλήρη ανάπτυξη αλλά σε πολύ μεγάλη Βʹ. Έμφαση στη δημιουργία του Android Client αρχικά με πλήρες σετ από test cases Γʹ. Έμφαση στη δημιουργία και έλεγχο της end-to-end αρχιτεκτονικής με ορισμό των interfaces των υποσυστημάτων χωρίς λεπτομέρεια στην υλοποίηση Δʹ. Έμφαση στη δημιουργία του backend, με υλοποίηση και έλεγχο των βασικών λειτουργιών πρώτα εκεί και στη συνέχεια υλοποίηση του client Εʹ. Έμφαση στη δημιουργία του front-end και των μενού της εφαρμογής αρχικά, ώστε να ξεκαθαριστούν πλήρως οι απαιτήσεις της εφαρμογής
Τεχνολογία Λογισμικού Τύπος Α Σελ. 3 / 8 2. (2 Μονάδες) Σας δίνετε μια κλάση όπως η ακόλουθη: public c l a s s Person implements Comparable<Person > { private S t r i n g name ; private S t r i n g surname ; public Person ( S t r i n g name, S t r i n g surname ) { t h i s. name = name ; t h i s. surname = surname ; public S t r i n g getname ( ) { return name ; public S t r i n g getsurname ( ) { return surname ; / / implement t h i s Σας λένε επίσης ότι πρέπει να υλοποιήσετε τη μέθοδο compareto() ώστε το ακόλουθο JUnit test να είναι πετυχημένο. @Test public void testcompare ( ) { Person person0 = new Person ( nikos, papas ) ; Person person1 = new Person ( nikos, papas ) ; Person person2 = new Person ( nikos, abel ) ; Person person3 = new Person ( nikos, tango ) ; Person person4 = new Person ( a l e x, papas ) ; Person person5 = new Person ( zenon, papas ) ; Person [ ] persons = new Person [ 6 ] ; persons [ 0 ] = person0 ; persons [ 1 ] = person1 ; persons [ 2 ] = person2 ; persons [ 3 ] = person3 ; persons [ 4 ] = person4 ; persons [ 5 ] = person5 ; Arrays. s o r t ( persons ) ; assertequals ( person2, persons [ 0 ] ) ; assertequals ( person4, persons [ 1 ] ) ; assertequals ( person0, persons [ 2 ] ) ; assertequals ( person1, persons [ 3 ] ) ; assertequals ( person5, persons [ 4 ] ) ; assertequals ( person3, persons [ 5 ] ) ;
Τεχνολογία Λογισμικού Τύπος Α Σελ. 4 / 8 Ποιες από τις παρακάτω υλοποιήσεις πιστεύετε ότι κάνει το test να περνάει Αʹ. i f ( t h i s. getsurname ( ). compareto ( o. getsurname ( ) ) >0 t h i s. getname ( ). compareto ( o. getname ( ) ) <0) { return 1 ; e l s e { return 0; Βʹ. i n t r e s u l t = t h i s. getname ( ). compareto ( o. getname ( ) ) ; return r e s u l t + t h i s. getsurname ( ). compareto ( o. getsurname ( ) ) ; Γʹ. Δʹ. i f ( t h i s. getname ( ). compareto ( o. getname ( ) ) == 0) { return t h i s. getsurname ( ). compareto ( o. getsurname ( ) ) ; e l s e { return t h i s. getname ( ). compareto ( o. getname ( ) ) ; i n t r e s u l t = t h i s. getsurname ( ). compareto ( o. getsurname ( ) ) ; i f ( r e s u l t!=0) { return r e s u l t ; return t h i s. getname ( ). compareto ( o. getname ( ) ) ; Εʹ. Καμία
Τεχνολογία Λογισμικού Τύπος Α Σελ. 5 / 8 3. (1 Μονάδες) Μια ομάδα φοιτητών ξεκινά project για το εργαστήριο της Μεθοδολογίας Προγραμματισμού To project αφορά την κατασκευή μιας εφαρμογής για την ανάπτυξη ενός προγράμματος Instant Messenger. Στο χρονοδιάγραμμα που ετοιμάζουν: 1. Τις δύο πρώτες εβδομάδες θα ασχοληθούν με την καταγραφή των απαιτήσεων και την εξοικείωση με το έργο. 2. Τις επόμενες δύο εβδομάδες θα ασχοληθούν με το σχεδιασμό του GUI 3. Τις επόμενες τρεις εβδομάδες θα ασχοληθούν με την υλοποίηση του GUI και των οθονών που επιτρέπουν την είσοδο στο σύστημα (login, προτιμήσεις κτλ) 4. Τις επόμενες 4 εβδομάδες θα ασχοληθούν με το σχεδιασμό και υλοποίηση της λειτουργίας αποστολής μηνυμάτων 5. Τις επόμενες 2 εβδομάδες με τον τελικό έλεγχο και παράδοση της εφαρμογής Εσείς πιστεύετε ότι: Αʹ. Η ομάδα ακολούθησε μια ευέλικτη μεθοδολογία αφού έκανε επαναλήψεις και προσάρμοζε τη διάρκειά τους στις ανάγκες της Βʹ. Η ομάδα ακολούθησε τη μεθοδολογία του καταρρακτη γιατί ακολούθησε τα τυπικά βήματα της καταγραφής απαιτήσεων, σχεδιασης, ελέγχου παράδοσης Γʹ. Η ομάδα δεν ακολούθησε τη μεθοδολογία του καταρράκτη γιατί παρόλο που έκανε τα τυπικα βήματα δεν αναφέρεται πουθενά αν υπήρχε ανασκοπηση (review) στο τέλος κάθε βήματος Δʹ. Η ομάδα ακολούθησε τη μεθοδολογία UP γιατί κάτε της βήμα αντιστοιχει και σε μια φάση της UP Εʹ.. H ομάδα ακολούθησε μια επαναληπτική μεθοδολογία, αν και όχι κατ ανάγκη ευέλικτη 4. (1 Μονάδες) Στο project σας ακολουθείτε το mainline model και τη μεθοδολογία UP.. Κάθε πότε πιστεύετε ότι πρέπει να δημιουργείτε release branch για να δώσετε το πρόγραμμά σας στους πελάτες σας; Αʹ. στο τέλος κάθε iteration Βʹ. στο τέλος κάθε ημέρας Γʹ. στο τέλος κάθε φάσης Δʹ. στο τέλος της κατασκευαστικής φάσης Εʹ. στο τέλος της φάσης μετάβασης 5. (1 Μονάδες) Η διαφορά ενός build script από έναν compiler είναι
Τεχνολογία Λογισμικού Τύπος Α Σελ. 6 / 8 Αʹ. Ένα build script τρέχει πρίν και μετά τη φάση του compiling. Πριν τη φάση του compiling κάνει checkout και μετά τη φάση του compiling κάνει testing. Βʹ. To build script αυτοματοποιεί διάφορες διαδικασίες που είναι απαραίτητες για τη δημιουργία του τελικού προϊόντος. Το compiling είναι απλώς μία από αυτές. Γʹ. Καμία. Το build script είναι ένας compiler που τρέχει απομακρυσμένα. Δʹ. To build script αυτοματοποιεί τις διαδικασίες ελέγχου. Ένας compiler ασχολείται με τη μεταγλώττιση. Εʹ. Τίποτα από τα παραπάνω
Τεχνολογία Λογισμικού Τύπος Α Σελ. 7 / 8 6. (2 Μονάδες) Σας δίνεται η ακόλουθη περιγραφη μιας μεθόδου της κλάσης String. Γράψτε JUnit tests που να ελέγχουν όσο το δυνατό μεγαλύτερο μέρος της συμπεριφοράς αυτής της μεθόδου public S t r i n g s u b s t r i n g ( i n t beginindex, i n t endindex ) / / Returns a new s t r i n g t h a t i s a s u b s t r i n g o f t h i s s t r i n g. The s u b s t r i n g b e g i n s a t t h e s p e c i f i e d b e g i n I n d e x and e x t e n d s t o t h e c h a r a c t e r a t i n d e x endindex 1. Thus t h e l e n g t h o f t h e s u b s t r i n g i s endindex b e g i n I n d e x. Examples : / / hamburger. s u b s t r i n g (4, 8) r e t u r n s urge / / s m i l e s. s u b s t r i n g (1, 5) r e t u r n s m i l e Parameters : / / b e g i n I n d e x t h e b e g i n n i n g index, i n c l u s i v e. / / endindex t h e e n d i n g index, e x c l u s i v e. Returns : / / t h e s p e c i f i e d s u b s t r i n g. Throws : / / IndexOutOfBoundsException i f t h e b e g i n I n d e x i s n e g a t i v e, o r endindex i s l a r g e r than t h e l e n g t h o f t h i s S t r i n g o b j e c t, o r b e g i n I n d e x i s l a r g e r than endindex. 7. (2 Μονάδες) Γράφετε μια εφαρμογή και είστε υπεύθυνος για να γράψετε τον StudentController που αποθηκεύει στοιχεία μέσω μιας κλάσης Repository σε μια σχεσιακή βάση. Οι συνεργάτες σας, σας λένε ότι μπορείτε να χρησιμοποιήσετε την κλάση Repository η οποία ορίζεται όπως πιο κάτω: public c l a s s Repository { Student savestudentdata ( S t r i n g name, S t r i n g aem, List <String > l e s s o n s ) throws RPersistenceException { / / s a v e t o r e l a t i o n a l d a t a b a s e / / i f you can t / / throw R P e r s i s t e n c e E x c e p t i o n
Τεχνολογία Λογισμικού Τύπος Α Σελ. 8 / 8 Αναθέτετε τη συγγραφή της κλάσης σε ένα από τα junior μέλη της ομάδας το οποίο έρχεται με αυτή τη λύση: public c l a s s S t u d e n t C o n t r o l l e r { / / public i n t c r e a t e S t u d e n t ( S t r i n g name, S t r i n g aem) throws RPersistenceException { Repository r e p o s i t o r y = RepositoryFactory. g e t I n s t a n c e ( ) ; try { / / g e t some s t u d e n t d a t a from e x t e r n a l d a t a b a s e / / e x t e r n a l D a t a b a s e i s d e f i n e d e l s e w h e r e. Don t be b o t h e r e d List < String > lessonsforstudent = externaldatabase. getlessonsforyear ( aem) ; Student student = r e p o s i t o r y. savestudentdata (name, aem, lessonsforstudent ) ; catch ( RPersistenceException e ) { / / l o g e r r o r throw e ; Προτείνετε μια σχεδίαση που θα σας επέτρεπε να δοκιμάσετε την κλάση σας. Σε ποιές κλάσεις θα κάνατε αλλαγές; Δείξτε το με διάγραμα UML. Δείξτε τουλάχιστον τρία junit tests για αυτή τη σχεδίαση.