The course Object-Oriented Programming and Design provides students with a fundamental foundation for software development according to one of the most relevant paradigms in today’s professional and academic contexts. Building on prior knowledge of imperative and procedural programming, the course introduces the principles of object-oriented software design and structuring, fostering a stronger understanding of how to construct modular, scalable, and maintainable computer systems. It also contributes to the development of skills related to collaborative work in development environments, in line with the dynamics of professional practice. In this sense, it constitutes an important foundation for subsequent courses related to software development, software engineering, and the construction of complex systems.
Titular Professors
Professors
Basic knowledge of imperative programming and algorithms.
It is recommended that students have completed: (50011 / 50A11) Programming Methodology and Technology.
This course aims to enable students to understand and apply the principles of the object-oriented programming paradigm in the development of software solutions, using a modern programming language and a development environment typical of professional settings. It also seeks to develop students’ ability to design software based on defined specifications, integrate design patterns as tools for building structured and maintainable solutions, and work effectively in development teams. Overall, the course contributes to students’ training in core competencies for the degree profile in computer engineering and provides a relevant foundation for subsequent subjects related to software development and software engineering.
The detailed course contents are not presented chronologically; rather, they combine the different conceptual, design, and implementation elements for each theoretical block.
Knowledge of the object-oriented paradigm.
- Concept of Class or Prototype
- Concept of Object or Instance
- Class Variables and Instance Variables
- Concept of Message or Method
- Concept of Encapsulation and Abstraction
- Concept of Inheritance
- Concept of Polymorphism
- Concept of Interface
Knowledge of a real-world object-oriented language.
- Introduction and main features of Java
- Introduction to the Java language
- Variables and data types
- Operators
- Statements, expressions, and blocks
- Flow control statements
- Exception handling
- Introduction to OOP
- Class declaration
- Object instantiation and use
- Modifiers: static and final
- Enumerations
- Inheritance in Java
- Interfaces
- Class hierarchy in Java
- Multiple inheritance
- Method overriding
- Polymorphism
- The “super” reference
- Subclass constructors
- Abstract methods and classes
- Introduction to generics
- Concurrency with threads
- The AWT / Swing graphics library
Use of a real-world development environment.
- UML diagram modeling tool
- IntelliJ IDEA as a development environment
- Git as a version control system
- Jira as a project management tool
Ability to design software based on specifications.
- Introduction to the UML language
- Representation of Class / Object / Message
- Encapsulation and Abstraction
- Encapsulation vs. Visibility
- Relationships between classes
Use of software design patterns.
- Introduction to GRASP patterns
- Introduction to software architecture
- Responsibility-driven design
- Data-oriented design patterns
Teamwork in a software development project.
- Communication tools for teams
- Version control systems
- Project management tools
The course contents are distributed throughout the academic year, and the order in which they are taught does not correspond to the order of the syllabus listed above. Concepts are introduced and reinforced progressively throughout the course. Analysis, design, implementation, and pattern-related topics are addressed iteratively throughout the year as different data structures are introduced.
The teaching methodology of the course is based on an active, theory-and-practice-oriented approach aimed at the progressive achievement of the learning outcomes and aligned with the course’s instructional planning. Throughout the year, introductory lectures, problem-solving and exercise sessions, guided practical work, and independent student work are combined in order to promote active participation in the learning process. The methodological sequence of the contents is generally structured around three complementary levels: an initial conceptual introduction, the treatment of the associated software design principles, and finally their implementation in an object-oriented programming language.
The course is also organized differently across the two semesters. In the first semester, teaching focuses on the acquisition of the foundations of the object-oriented paradigm and Java programming through lecture-based sessions, exercise solving, and application-oriented practical work. In the second semester, the methodology evolves toward a project-based learning approach, in which students consolidate and integrate the knowledge acquired through the development of a software project contextualized in an environment close to professional practice. Flipped classroom strategies are occasionally incorporated to encourage prior preparation of some theoretical content and to reinforce the use of in-person class time as a space for application, guidance, and doubt resolution.
Overall, this methodology ensures coherence among learning activities, independent work, instructional support, and the continuous assessment system.
Assessment in this course is based on a continuous assessment system, complemented by practical projects. The final grade is calculated based on the following components:
- Continuous assessment: 40%
- Projects: 60%
To pass the course, students must obtain a minimum grade of 5 out of 10 in both course projects. If this minimum is not achieved, no average will be calculated with the remaining assessment activities.
Students’ understanding and correct application of the principles of the object-oriented programming paradigm will be assessed, as will their ability to appropriately use an object-oriented programming language and a development environment typical of professional contexts. Likewise, consideration will be given to students’ ability to design software solutions based on specific requirements, the coherence between the proposed design and its implementation, and the appropriate use of design patterns according to the problem posed. In practical and project-based activities, the technical quality of the code produced will also be assessed according to criteria such as correctness, structure, readability, modularity, and maintainability. Finally, in collaborative activities, students’ ability to work effectively in teams will be considered, including active contribution to the shared development of tasks, work organization, and the achievement of common goals.
[1] C.S.Horstman and G.Cornell, Core Java 2, Vol I. Fundamentos, Septima edición, Prentice Hall, 2006.
[2] K.Arnold, JGosling and D.Holmes, The Java programming language, Boston : Addison-Wesley, 2000
[3] M.Fowler, UML Distilled Third Edition. A brief guide to the standard object modeling language, Addison-Wesley, 2003.
[4] R.Miles and K.Hamilton, Learning UML 2.0, O'Reilly Media Inc, 2006.
[5] C.Larman, Applying UML and patterns : an introduction to object-oriented analysis and design, Prentice Hall PTR, 1998
[6] E.Gamma, R.Helm, R.Johnson and J.Vlissides, Design patterns: elements of reusable object-oriented software, Addison-Wesley Longman Publishing Co., 1995
[7] J.Cooper, Java Design Patterns, Addison Wesley, 2000
[8] D.Lea, Concurrent programming in Java: design principles and patterns, Addison-Wesley, 2000
[9] M.Fowler, Refactoring: Improving the Design of Existing Code, Addison-Wesley Professional, 2018
[10] R.Martin, Clean Code: A Handbook of Agile Software Craftsmanship, Pearson, 2008
[11] K.Sierra and B.Bates, Head First Java, O'Reilly Media, 2005
[12] E.Freeman, B.Bates, K.Sierra and E.Robson, Head First Design Patterns: A Brain-Friendly Guide, O'Reilly Media, 2004