Preparación PDF
Document Details
Tags
Related
- Object-Oriented Software Development Introduction PDF
- Object-Oriented Software Development Principles PDF
- Topic 1.3 Defining Object Model PDF
- Object-Oriented Software Development PDF - TOMK18/TOUK18 Autumn 2024
- Jönköping University Object-Oriented Software Development Lecture 02 PDF
- Object Oriented Programming (2nd Year 1st Sem) PDF
Summary
This document discusses general concepts, SOLID principles, Scrum methodologies, and Python programming concepts, including object-oriented programming and design patterns. It also mentions data structures and some tools/frameworks for development.
Full Transcript
Conceptos generales ------------------- #### **CleanCode:** - - - - - - #### **Solid:** Resumen propio. SOLID nos condiciona a usar una estructura de interfaces "clases abstractas" y clases que extienden de dichas interfaces. La interfaz es una estructura que define las funciones ne...
Conceptos generales ------------------- #### **CleanCode:** - - - - - - #### **Solid:** Resumen propio. SOLID nos condiciona a usar una estructura de interfaces "clases abstractas" y clases que extienden de dichas interfaces. La interfaz es una estructura que define las funciones necesarias "estilo contrato" pero que usamos para crear clases definitivas con funcionalidad declarada sobreescribiendo los métodos definidos en la interfaz. SOLID es un conjunto de cinco principios de diseño orientado a objetos que ayuda a crear sistemas más flexibles, mantenibles y escalables: 1. 2. **Usar la extensión de clases teniendo una base por ejemplo enviar email y creando clases mas especificas que extiendan de esta para usar el sendEmail pero con modificaciones en la plantilla por ejemplo.** \"abiertas para extensión\" significa que puedes agregar nueva funcionalidad extendiendo la clase (heredando o componiendo), y \"cerradas para modificación\" implica que no debes modificar el código existente para añadir nuevos comportamientos. Esto minimiza el riesgo de romper el código existente cuando se añaden nuevas características. 3. **Las subclases deben poder sustituir a las clases base sin alterar el funcionamiento del programa. De lo contrario crea una nueva clase base porque no estás cumpliendo con este principio.\ \ ** 4. **Por ejemplo, en lugar de tener una interfaz Payment que incluya métodos tanto para pagos con tarjeta como con efectivo, se puede crear una interfaz para cada tipo de pago específico, evitando métodos innecesarios en las clases que las implementan.** 5. **Esto permite que las clases cambien o se extiendan sin afectar a otras partes del sistema. Por ejemplo, en lugar de que una clase de procesamiento de pagos dependa directamente de una clase específica de tarjeta de crédito, dependerá de una interfaz PaymentService que pueda ser implementada por cualquier método de pago (tarjeta, efectivo, etc.). Ojo, clases de alto nivel esto significa que al final usaremos la clase a la que le hemos añadido los métodos para el objeto final.** #### **Las interfaces se declaran así:** **Para mayor control extendemos de ABC y usamos el decorador abstractmethod.\ \ from abc import ABC, abstractmethod** **\# Definimos una clase abstracta** **class PaymentServiceInterface(ABC):** **\@abstractmethod** **def process\_payment(self, amount):** ***\"\"\"Este método debe ser implementado por las subclases\"\"\"*** **raise NotImplementedError(\"Debes implementar este método en una subclase\")** ### **Scrum: Resumen** Herramientas Jira, Trello 1. - 2. - 3. - 1. 2. 3. 4. - 5. - 6. - - 7. - ### **Roles en Scrum:** 1. 2. 3. ### **Conceptos python:** #### **Programación Orientada a Objetos (Python):** - - y poco mas, recordar que los métodos de clase acceden a atributos de clase y los estáticos no. #### **Patrones de diseño:** **Singleton**: Garantiza que una clase tenga solo una instancia y proporciona un punto de acceso global a ella. **Factory Method**: Define una interfaz para crear objetos en una clase, pero permite que las subclases alteren el tipo de objetos que se crearán. **Abstract Factory**: Proporciona una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas. **Builder**: Separa la construcción de un objeto complejo de su representación, de manera que el mismo proceso de construcción puede crear diferentes representaciones. **Creamos clases que alojan métodos de construcción de otras clases así podemos tener distintos constructores.** **Prototype**: Permite crear nuevos objetos copiando una instancia existente, en lugar de crear nuevos objetos desde cero. **Pilas: Listas usando append() y pop(),** el ultimo en entrar es el primero en salir. #### **Estructuras de datos** **Listas: ordenadas y mutables** **Tuplas: ordenadas pero inmutables** **Conjuntos: No ordenadas, mutables, elementos únicos** **Clases.** **Diccionarios:** Colecciones no ordenadas y mutables, clave única jaja **List Comprehension:** Me encantan, aqui me la juego. **La manera más maravillosa de crear listas abstractas de una manera eficiente y con muy poco código.** **Deque =** al usarlo podemos decidir por que lado eliminamos elementos inicio o final **pop() o popleft(). Es una estructura muy eficiente para operaciones de inserción y eliminación en ambos extremos.** **Colas =** Se declaran así: **cola = deque()** y el primero en entrar el el primero en salir con **append() y popleft()** **OrderedDict() = No hace falta ni decirlo** **RANGE = range(1, 10)** **ButeArray= bytearray(\[1, 2, 3\])** **También podemos inicializar con defaultdict(list) si no petaría al hacer mi\_defaultdict\[\"frutas\"\].append(\"manzana\") porque no existiría la lista.** #### **Estructuras primitivas** **Numero enteros int** **Números de punto flotante (float)** **Cadenas de texto (str)** **Booleanos (bool)** Esencialmente subclase de int() Donde 1 es true y 0 False **Tipos vacíos (None)\ \ ** Este es especial: **Números complejos (complex)** representación de **valores imaginarios "1" z2 = 1 + 2j** ### **Conceptos Django:** **Decoradores:** permite modificar el comportamiento de otra función o método sin cambiar su código **TemplateTag:** permite agregar lógica dinámica a las plantillas HTML Modelo: clase que representa la estructura de los datos y define la forma en que se almacenan en la base de datos. **Vista:** función o clase que gestiona las solicitudes (requests) **Serializador:** Objetos complejos a formatos de datos que puedan ser fácilmente renderizados o transportados, como JSON, XML, o otros formatos. **Middlewares:** Funciones intermedias **forms.py** **Listas basadas en clases:** **Las más importantes incluyen:** - - - ### **ApiRest Con Django Rest Freamework** #### **Fundamentos:** **Serializadores**: Convertir objetos complejos (como modelos de Django) en formatos legibles como JSON o XML, y validar datos entrantes. **Vistas**: Funciones o clases que gestionan las solicitudes y respuestas HTTP. **ViewSets**: Abstracción para manejar las operaciones CRUD en vistas (mejora la reutilización y simplificación) e implementa automáticamente todos los métodos CRUD. **Routers**: Generan automáticamente las rutas (URLs) para las APIs basadas en ViewSets. **Permisos**: Controlan el acceso a las vistas, definiendo quién puede acceder y modificar datos. **Autenticación**: Mecanismos para gestionar la autenticación de usuarios en las APIs. Las APIs RESTful tienden a ser sin estado, lo que significa que cada solicitud debería ser independiente y no mantener una sesión activa, por eso aunque no me guste: Alternativa: **Autenticación con JWT (JSON Web Token)** (opcional) instalar libreria Se genera y despues el cliente lo envia en el header:\ Authorization: Bearer \ ### **Importante** **Pruebas unitarias en Django y Python**: Saber cómo escribir **tests** con el módulo unittest o pytest, así como pruebas en Django (TestCase), sería un plus. **TDD:** Me encanta la idea de plasmar la lógica creando una serie de test para tener los objetivos a cumplir e ir desarrollando el código cumpliendo estos objetivos (Test) **Bases de datos y ORM**: Quizá alguna pregunta sobre **cómo optimizar consultas en Django ORM** o cómo funcionan las **migraciones**. ### **Migraciones de base de datos** **Crear migraciones**: Django genera automáticamente archivos de migración que describen los cambios en los modelos. - - **Aplicar migraciones**: Una vez creadas las migraciones, deben aplicarse a la base de datos. - - **Migraciones inversas**: Django también permite **revertir migraciones** en caso de errores o cambios en los requisitos. - ### **Optimización de Consultas con Django ORM** #### **1. select\_related() y prefetch\_related():** Estas funciones ayudan a optimizar las consultas relacionadas con las **ForeignKey** y **ManyToManyField** para evitar el problema del **N+1**. - - #### **2. Evitar consultas innecesarias:** Si necesitas solo algunos campos de un modelo, usa **only()** o **defer()** para limitar la cantidad de datos que se recuperan de la base de datos. - - #### **3. annotate() y aggregate():** Para optimizar el cálculo de agregados (como sumas, conteos, etc.), puedes usar estas funciones del ORM. **annotate()**: Añade un campo calculado a cada objeto del queryset.\ Ejemplo:\ python\ \ from django.db.models import Count autores\_con\_libros = Autor.objects.annotate(num\_libros=Count(\'libro\')) - **aggregate()**: Realiza cálculos sobre todo el conjunto de datos.\ Ejemplo:\ python\ \ from django.db.models import Avg promedio\_libros = Libro.objects.aggregate(promedio=Avg(\'numero\_paginas\')) Tener en cuenta que se pueden anotar agregaciones y esto es muy potente. 5\. **Paginar consultas**: nada, paginar consultas **Autenticación en Django**: Saber cómo funciona el sistema de **usuarios y permisos** es importante para muchas entrevistas. Oauth2 6\. **bulk\_create para inserciones masivas junto con atomic transaction** ### **7. Cachear resultados en un diccionario** Esto es útil para hacer comprobaciones rápidas o consultas sin enviar peticiones a base de datos. Cuando hay un conjunto muy grande de objetos. **CELERY** **Usar servicios asíncronos como CELERY para ejecutar tareas en segundo plano y listas de tareas.** **AWS AI** ---------- ### **1. Instancias EC2 para Machine Learning:** **Amazon EC2 (Elastic Compute Cloud) proporciona instancias con distintos tipos de hardware optimizado para tareas de ML e IA. Algunos ejemplos clave son:** - - - - - - ### **2. Amazon SageMaker:** **Amazon SageMaker es un servicio gestionado que simplifica el proceso completo de desarrollo de modelos de ML, desde la preparación de datos hasta el entrenamiento, despliegue y monitoreo.** - - - ### **3. AWS Inferentia:** **AWS Inferentia es un chip personalizado desarrollado por AWS, diseñado específicamente para realizar inferencia de modelos de IA de manera eficiente y rentable.** - ### **4. Elastic Inference:** **Amazon Elastic Inference permite añadir capacidad de GPU elástica a instancias EC2, SageMaker, o Amazon ECS. Es útil para inferencias cuando el modelo no necesita toda la potencia de una instancia GPU completa, ahorrando costos.** ### **5. AWS Lambda:** **AWS Lambda puede utilizarse para ejecutar inferencias de modelos pequeños o realizar predicciones de manera escalable sin necesidad de administrar servidores. Es una solución serverless ideal para inferencia ligera o por lotes.** ### **6. Amazon EMR (Elastic MapReduce):** **Amazon EMR permite procesar grandes volúmenes de datos y entrenar modelos usando frameworks de Big Data como Apache Spark o TensorFlow en clústeres distribuidos.** ### **7. AWS Fargate "[[Amazon Elastic Container Service]](https://eu-west-3.console.aws.amazon.com/ecs/v2/home?region=eu-west-3)":** **AWS Fargate permite ejecutar contenedores sin administrar servidores. Es útil para ejecutar inferencias de modelos de ML dentro de contenedores en un entorno serverless.** ### **Docker:** **Docker** es una plataforma de virtualización ligera que permite empaquetar aplicaciones y sus dependencias en **contenedores**. Estos contenedores son portátiles y reproducibles, lo que facilita la ejecución de aplicaciones en cualquier entorno, sin preocuparse por las diferencias en configuraciones de sistemas. Las imágenes de Docker contienen todo lo necesario (código, librerías, entorno de ejecución) para ejecutar la aplicación, y pueden ser desplegadas como contenedores. #### **Ventajas de Docker:** - - - ### **Kubernetes:** **Kubernetes** es una plataforma de **orquestación de contenedores** que automatiza el despliegue, la escalabilidad, la gestión y el monitoreo de aplicaciones en contenedores. Es especialmente útil cuando necesitas gestionar múltiples contenedores distribuidos en varios servidores. #### **Principales características de Kubernetes:** - - - - ### **Integración de Docker y Kubernetes en AWS:** AWS ofrece servicios que integran Docker y Kubernetes para facilitar la gestión de contenedores en la nube: 1. - - 2. - - ### **Cómo se integran Docker y Kubernetes en AWS:** - - En resumen, Docker se utiliza para empaquetar y ejecutar aplicaciones en contenedores, mientras que Kubernetes, mediante servicios como **EKS**, automatiza la gestión de esos contenedores en clústeres escalables. AWS proporciona servicios como **ECS** y **EKS** que simplifican la ejecución de aplicaciones en contenedores en la nube. ### **CI/CD** **Github Actions:** deploy.yml y configuración con clave pública y clave privada en Github