Lezioni di Informatica 4 - Introduzione alla OOP PDF
Document Details
IIS 'Marzotto-Luzzatti'
Anmolpreet
Tags
Summary
These lecture notes provide an introduction to object-oriented programming (OOP). They cover various programming languages and concepts related to OOP, like classes, objects, and methods. The lecture materials seem to describe different object-oriented languages, and discuss OOP concepts such as encapsulation, inheritance, and polymorphism.
Full Transcript
I.I.S. “Marzotto-Luzzatti” - Valdagno Dipartimento di Informatica Prof. Riccardo Crosato Introduzione alla Programmazione orientata agli oggetti Paradigma imperativo procedurale Prof. Riccardo Crosat...
I.I.S. “Marzotto-Luzzatti” - Valdagno Dipartimento di Informatica Prof. Riccardo Crosato Introduzione alla Programmazione orientata agli oggetti Paradigma imperativo procedurale Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 2 Programmare ad oggetti Problema: rigidità, fragilità e non riusabilità del software procedurale Obiettivo: ridurre i costi di produzione e manutenzione del software puntando sulla riusabilità del software Soluzione: programmazione orientata agli oggetti (Object-Oriented Programming - OOP) La OOP punta a consentire una maggiore astrazione nello sviluppo dei programmi e ruota attorno al concetto di oggetto, come entità software dotata di determinate caratteristiche e funzionalità N.B.: programmare ad oggetti non velocizza l’esecuzione dei programmi e non ottimizza l’uso della memoria ma facilita la progettazione, lo sviluppo e il mantenimento di sistemi software molto complessi Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 3 Paradigma orientato agli oggetti Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 4 Alcuni linguaggi OOP... Il primo uso della programmazione ad oggetti è stato fatto per effettuare simulazioni del mondo reale. Alcuni linguaggi OOP importanti sono: 1967 → Simula, sviluppato al Norwegian Computing Center di Oslo, principalmente da Ole-Johan Dahl e Kristen Nygaard. Ispirato ad ALGOL, è il primo linguaggio di programmazione orientato agli oggetti (l’elaborazione non è più descritta da una procedura, ma è ottenuta da una “simulazione” del mondo, di cui gli oggetti sono un modello) 1970 → Smalltalk, di Alan Kay (Xerox PARC, Palo Alto Research Center), derivato da Simula, è uno dei primi linguaggi a dimostrare la potenza della programmazione ad oggetti. Alan Kay è tra gli ideatori del paradigma di programmazione ad oggetti (premio Turing 2003) oltre ad aver inventato le interfacce grafiche e aver contribuito a molti sviluppi dell'informatica Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 5 Alcuni linguaggi OOP... 1983 → C++, di Bjarne Stroustrup (AT&T Bell Labs) sviluppato come miglioramento del C con l’introduzione della programmazione ad oggetti (si chiamava inizialmente “C con classi”) Ha influenzato molti linguaggi successivi come Java, C#, PHP, … Molti software applicativi e librerie dei sistemi operativi sono scritte in C++. 1986 → Eiffel, di Bertrand Mayer (Politecnico di Zurigo, Eiffel Software), linguaggio orientato agli oggetti pensato per l’utilizzo industriale. Ha influenzato linguaggi successivi come Java e C# Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 6 Alcuni linguaggi OOP... 1991 → Python, di Guido van Rossum, linguaggio orientato agli oggetti che predilige la leggibilità e semplicità. Negli ultimi anni si è molto diffuso nello sviluppo di applicazioni web, nel calcolo scientifico e come linguaggio introduttivo per gli studenti 1995 → Java, di James Gosling (Sun Microsystems), linguaggio di ampia diffusione, orientato agli oggetti e progettato per essere il più possibile indipendente dalla piattaforma di esecuzione (famoso il motto WORA, “write once, run anywhere”) perché basato sul concetto di macchina virtuale (JVM, Java Virtual Machine) Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 7 Alcuni linguaggi OOP. 1995 → Delphi, di Anders Hejlsberg (Borland), linguaggio orientato agli oggetti basato sul linguaggio Pascal. E’ anche un ambiente di sviluppo, primo ad essere completamente visuale e primo ad essere conosciuto come strumento RAD, Rapid Application Development. 2000 → C#, di Anders Hejlsberg, linguaggio orientato agli oggetti sviluppato da Microsoft all’interno dell’iniziativa.NET, e successivamente approvato come standard ECMA e ISO. 2012 → Kotlin, di Andrey Breslav, linguaggio orientato agli oggetti e multi paradigma sviluppato da JetBrains e preferito da Google, a partire dal 2019, per lo sviluppo sulla piattaforma Android 2014 → Swift, di Chris Lattner, linguaggio orientato agli oggetti sviluppato da Apple per lo sviluppo su sistemi Apple e Linux. Sostituisce il precedente linguaggio Objective-C Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 8 “Mattoni” fondanti della OOP Incapsulamento (encapsulation) e occultamento dell’informazione (information hiding) → viene nascosta la struttura interna dell’oggetto che si comporta come una capsula che raggruppa dati e codice al suo interno Ereditarietà (inheritance) → si derivano oggetti più specializzati senza doverli riscrivere da zero Polimorfismo (polymorphism): → lo stesso oggetto durante l’esecuzione del programma può realizzare comportamenti diversi (attraverso la selezione dinamica dei metodi da eseguire) Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 9 Vantaggi della OOP Vantaggi dei programmi ad oggetti: – ridurre la dipendenza del codice di alto livello dalla rappresentazione dei dati (l’accesso ai dati è mediato da un’interfaccia) – riutilizzare il codice di alto livello, definendo opportune classi astratte – sviluppare moduli indipendenti l’uno dall’altro Difetti del software non mantenibile (non ad oggetti): – rigidità: non può essere cambiato con facilità, non può essere stimato l’impatto di una modifica – fragilità: una modifica singola causa una cascata di modifiche successive, i bug sorgono in aree concettualmente separate dalle aree dove sono avvenute le modifiche – non riusabilità: esistono molte interdipendenze, quindi non è possibile estrarre parti che potrebbero essere comuni Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 10 Oggetto Oggetto: entità con una struttura interna ed un involucro che espone un’interfaccia verso l’esterno, divisa in due sezioni: – comandi: per modificare lo stato interno dell’oggetto e quindi richiedere certe azioni all’oggetto – osservatori: che rappresentano all’esterno lo stato dell’oggetto Utente (o cliente): colui che utilizza l’oggetto dall’esterno agendo sui comandi e osservando gli effetti attraverso gli osservatori parleremo di codice consumer come quello che utilizza gli oggetti Implementatore: colui che ha progettato l’oggetto definendone la struttura interna e l’interfaccia con l’esterno Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 11 Involucro e interfaccia L’involucro dell’oggetto: – protegge l’utente dall’oggetto, nascondendo all’utente la struttura interna dell’oggetto e quindi fornendo una visione astratta dell’oggetto – protegge l’oggetto dall’utente, consentendo all’utente di accedere all’oggetto solo attraverso i comandi previsti dall’implementatore L’involucro realizza l’incapsulamento delle informazioni nascondendo all’utente lo stato interno rappresentato dai valori contenuti nell’oggetto e il codice utilizzato per realizzare le funzionalità Rendendo disponibile all’utente la sola interfaccia dell’oggetto: – si impediscono usi illegali dell’oggetto – si permette, un domani, di cambiare l’implementazione senza dover cambiare l’interfaccia d’uso (riuso del software) Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 12 Classi, oggetti e metodi Classe: tipo di oggetto: identificazione per oggetti che espongono all’esterno lo stesso comportamento E’ come uno “stampo” per gli oggetti Un oggetto è quindi un’istanza di una classe. Comandi e osservatori si chiamano metodi: – procedure per i comandi (modificano lo stato interno) – funzioni per gli osservatori (presentano all’esterno lo stato interno) In C# una classe si definisce con la parola chiave class e ingloba una serie membri cioè di definizioni di variabili (gli attributi o campi) e metodi Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 13 Esempio: approccio rigido vs OOP Immaginiamo un gioco simulato su un campo di battaglia dove combattono soldati di tipo diverso (arcieri, fanti, cavalieri, …) Tutti i soldati devono capire il messaggio attacca Il messaggio ha conseguenze diverse a seconda del tipo di soldato: – un arciere scaglia una freccia – un fante colpisce di spada – un cavaliere lancia una lancia Il giocatore/computer deve gestire una lista di soldati e poter chiedere ad ogni soldato di attaccare indipendentemente dal tipo ma basandosi solo sulla posizione Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 14 Esempio: approccio rigido vs OOP Un codice rigido, scritto in modo tradizionale potrebbe essere: void attacca(Soldato tipo) { if (tipo == arciere) scagliaLaFreccia(); else if (tipo == fante) colpisciDiSpada(); else if (tipo == cavaliere) lanciaLaLancia(); } un esempio di codice flessibile invece: Soldato s; // …… s.attacca(); se c’è la necessità di aggiungere nuovi tipi di soldato, il codice non cambia! Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 15 Classi in C# Una classe può avere un qualsiasi quantitativo di dati e qualsiasi numero di metodi In un buon approccio object oriented i dati devono essere nascosti, ovvero incapsulati all’interno della classe che li utilizza Campi e metodi vengono chiamati membri della classe L’incapsulamento viene attuato in C# mediante l’uso di direttive con la funzione di specificatori di accesso Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 16 Specificatori di accesso Specificatori di accesso in ordine di visibilità (dal meno visibile al più visibile): – private (privato): denota campi e metodi non accessibili all’esterno della classe – protected (protetto): denota campi e metodi soggetti a protezione parziale. Agli elementi protetti si può accedere dalla classe corrente e da tutte le classi da essa derivate, ma non dal codice che utilizza la classe (codice consumer) – public (pubblico): denota campi e metodi liberamente accessibili da parte di qualsiasi altra porzione del codice Lo specificatore private è il default in C#, per cui può non essere specificato nella definizione della classe Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 17 Altri specificatori di accesso C# Possono essere presenti altri livelli; in C# abbiamo i seguenti: – internal (interno): denota campi e metodi accessibili ovunque all’interno dei file sorgenti che compongono l’assembly, ovvero il programma (nell’ambito del programma è come fossero pubblici) – protected internal (protetto interno): è come internal ma con visibilità anche nelle classi derivate. In altre parole, i campi e metodi sono accessibili sia da tutte le classi interne al programma che da tutte la classi derivate anche in altri assembly – private protected (protetto privato), da C# 7.2 (dicembre 2017): indica membri accessibili nelle classi derivate ma solo all’interno dello stesso assembly Livelli di accessibilità C#: https://docs.microsoft.com/it-it/dotnet/csharp/language-reference/keywords/accessibility-levels Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 18 Esempio Implementazione della classe Codice utente (consumer) public class Contatore class Program { { private int conta; static void Main(string[] args) private int massimo; { Contatore c = new Contatore(); public void Imposta(int m) c.Imposta(10); { massimo = m; while (c.Conta()) conta = 0; WriteLine(c.GetValore()); } ReadKey(); public bool Conta() } { } conta = conta + 1; if (conta > massimo) return false; else return true; } public string GetValore() { return Convert.ToString(conta); } } Prof. Riccardo Crosato - Corso di Informatica e Telecomunicazioni 19