1. ¿Qué es el código limpio? |
El código limpio es un código que es fácil de leer, entender y modificar. Se basa en principios y buenas prácticas que facilitan el mantenimiento y la evolución del software. |
2. ¿Por qué es importante el código limpio? |
El código limpio es importante porque mejora la mantenibilidad, facilita la colaboración entre desarrolladores y reduce la probabilidad de errores y defectos en el software. |
3. ¿Qué es la regla del "principio de responsabilidad única" (SRP)? |
El principio de responsabilidad única establece que una clase debe tener solo una razón para cambiar, es decir, debe tener solo una responsabilidad o función. |
4. ¿Cómo se aplica SRP en Java? |
public class User {
private String name;
private String email;
// Getters and setters
}
public class UserValidator {
public boolean validate(User user) {
// Validation logic
return true;
}
}
|
5. ¿Qué es el "principio de abierto/cerrado" (OCP)? |
El principio de abierto/cerrado establece que una clase debe estar abierta para la extensión pero cerrada para la modificación. Esto significa que se debe poder extender el comportamiento de una clase sin modificar su código fuente. |
6. ¿Cómo se aplica OCP en Python? |
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def draw(self):
pass
class Circle(Shape):
def draw(self):
print("Drawing a circle")
class Square(Shape):
def draw(self):
print("Drawing a square")
|
7. ¿Qué es el "principio de sustitución de Liskov" (LSP)? |
El principio de sustitución de Liskov establece que los objetos de una clase derivada deben poder sustituirse por objetos de la clase base sin alterar el correcto funcionamiento del programa. |
8. ¿Cómo se aplica LSP en C#? |
public class Bird
{
public virtual void Fly()
{
Console.WriteLine("Flying");
}
}
public class Sparrow : Bird
{
public override void Fly()
{
Console.WriteLine("Sparrow flying");
}
}
|
9. ¿Qué es el "principio de segregación de interfaces" (ISP)? |
El principio de segregación de interfaces establece que una clase no debe verse obligada a implementar interfaces que no utiliza. Es mejor tener muchas interfaces específicas en lugar de una interfaz general. |
10. ¿Cómo se aplica ISP en TypeScript? |
interface Shape {
draw(): void;
}
interface Scalable {
scale(factor: number): void;
}
class Circle implements Shape, Scalable {
draw() {
console.log("Drawing a circle");
}
scale(factor: number) {
console.log(`Scaling circle by ${factor}`);
}
}
|
11. ¿Qué es el "principio de inversión de dependencias" (DIP)? |
El principio de inversión de dependencias establece que los módulos de alto nivel no deben depender de módulos de bajo nivel. Ambos deben depender de abstracciones. Además, las abstracciones no deben depender de los detalles, sino los detalles de las abstracciones. |
12. ¿Cómo se aplica DIP en Java? |
public interface NotificationService {
void send(String message);
}
public class EmailNotificationService implements NotificationService {
public void send(String message) {
System.out.println("Sending email: " + message);
}
}
public class User {
private NotificationService notificationService;
public User(NotificationService notificationService) {
this.notificationService = notificationService;
}
public void notify(String message) {
notificationService.send(message);
}
}
|
13. ¿Qué es el principio de "nombre descriptivo" en el código? |
El principio de nombre descriptivo sugiere que los nombres de variables, funciones y clases deben ser claros y descriptivos para que el propósito del código sea evidente. |
14. ¿Cómo se aplican nombres descriptivos en Python? |
def calculate_area_of_rectangle(width, height):
return width * height
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def calculate_area(self):
return self.width * self.height
|
15. ¿Qué es el principio de "funciones pequeñas" en el código? |
El principio de funciones pequeñas sugiere que las funciones deben hacer una sola cosa y hacerla bien. Esto facilita la lectura y el mantenimiento del código. |
16. ¿Cómo se aplican funciones pequeñas en C#? |
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public int Subtract(int a, int b)
{
return a - b;
}
}
|
17. ¿Qué es el principio de "comentarios necesarios"? |
El principio de comentarios necesarios sugiere que el código debe ser tan claro que los comentarios sean mínimos. Los comentarios deben usarse solo para aclarar el código complejo o para explicar el "por qué" detrás de ciertas decisiones. |
18. ¿Cómo se aplica el principio de comentarios necesarios en TypeScript? |
// Calculates the area of a rectangle
function calculateArea(width: number, height: number): number {
return width * height;
}
|
19. ¿Qué es el principio de "eliminar el código muerto"? |
El principio de eliminar el código muerto establece que el código que no es utilizado o que no tiene un propósito debe ser eliminado para evitar confusión y mantener el código limpio. |
20. ¿Cómo se elimina el código muerto en Java? |
public class OldClass {
// This method is not used anywhere
public void oldMethod() {
// old logic
}
}
// Remove the unused method and class
|
21. ¿Qué es el principio de "evitar el código duplicado"? |
El principio de evitar el código duplicado establece que se debe evitar repetir el mismo código en diferentes lugares. En su lugar, se deben usar funciones o métodos reutilizables. |
22. ¿Cómo se evita el código duplicado en Python? |
def calculate_area(width, height):
return width * height
# Use the function wherever needed
area1 = calculate_area(5, 10)
area2 = calculate_area(7, 3)
|
23. ¿Qué es el principio de "pruebas unitarias"? |
El principio de pruebas unitarias establece que el código debe ser probado en pequeñas unidades (funciones o métodos) para asegurar que cada componente funciona correctamente. |
24. ¿Cómo se implementan pruebas unitarias en C#? |
[TestClass]
public class CalculatorTests
{
[TestMethod]
public void Add_ValidInputs_ReturnsSum()
{
Calculator calc = new Calculator();
int result = calc.Add(5, 3);
Assert.AreEqual(8, result);
}
}
|
25. ¿Qué es el principio de "abstraer detalles"? |
El principio de abstraer detalles establece que el código debe enfocarse en las interfaces y no en los detalles de implementación. Esto facilita la extensión y el mantenimiento del código. |
26. ¿Cómo se abstraen detalles en Java? |
public interface PaymentProcessor {
void processPayment(double amount);
}
public class PayPalProcessor implements PaymentProcessor {
public void processPayment(double amount) {
System.out.println("Processing payment via PayPal");
}
}
public class StripeProcessor implements PaymentProcessor {
public void processPayment(double amount) {
System.out.println("Processing payment via Stripe");
}
}
|
27. ¿Qué es el principio de "evitar dependencias circulares"? |
El principio de evitar dependencias circulares establece que los módulos o clases no deben depender unos de otros en un ciclo, ya que esto puede causar problemas de mantenimiento y acoplamiento fuerte. |
28. ¿Cómo se evitan dependencias circulares en Python? |
# Module A
class A:
def __init__(self, b):
self.b = b
# Module B
class B:
def __init__(self):
self.a = A(self)
# Refactor to avoid circular dependency
|
29. ¿Qué es el principio de "seguir el principio de menor sorpresa"? |
El principio de seguir el principio de menor sorpresa establece que el comportamiento del código debe ser intuitivo y no sorprender a otros desarrolladores. El código debe comportarse de la manera en que se espera. |
30. ¿Cómo se sigue el principio de menor sorpresa en C#? |
public class User
{
public string Name { get; set; }
public string GetUserName()
{
return Name;
}
}
// Use the class in a predictable way
User user = new User();
user.Name = "John";
Console.WriteLine(user.GetUserName());
|
31. ¿Qué es el principio de "utilizar convenciones"? |
El principio de utilizar convenciones establece que se deben seguir las convenciones de codificación establecidas para el proyecto o equipo, ya que esto mejora la legibilidad y coherencia del código. |
32. ¿Cómo se utilizan convenciones en TypeScript? |
|
33. ¿Qué es el principio de "módulos cohesivos"? |
El principio de módulos cohesivos establece que los módulos deben ser cohesivos, es decir, deben agrupar funcionalidades relacionadas y tener una responsabilidad clara. |
34. ¿Cómo se aplican módulos cohesivos en Java? |
public class Order {
private List- items;
public void addItem(Item item) {
items.add(item);
}
public double calculateTotal() {
double total = 0;
for (Item item : items) {
total += item.getPrice();
}
return total;
}
}
|
35. ¿Qué es el principio de "reducir la complejidad ciclómica"? |
El principio de reducir la complejidad ciclómica establece que se debe minimizar la complejidad del código para hacerlo más fácil de entender y mantener. Esto se puede lograr simplificando la lógica y reduciendo el número de caminos de ejecución. |
36. ¿Cómo se reduce la complejidad ciclómica en Python? |
def calculate_discount(price, discount):
if discount > 0:
return price - (price * discount)
return price
# Simplify conditional logic
def calculate_discount(price, discount):
return price - (price * discount) if discount > 0 else price
|
37. ¿Qué es el principio de "no repetir el mismo código" (DRY)? |
El principio de no repetir el mismo código, conocido como DRY (Don't Repeat Yourself), establece que el código duplicado debe ser refactorizado en funciones o módulos reutilizables para evitar la redundancia y facilitar el mantenimiento. |
38. ¿Cómo se aplica DRY en C#? |
public class TaxCalculator
{
public double CalculateTax(double amount)
{
return amount * 0.2;
}
}
public class Invoice
{
private TaxCalculator taxCalculator = new TaxCalculator();
public double CalculateTotal(double amount)
{
double tax = taxCalculator.CalculateTax(amount);
return amount + tax;
}
}
|
39. ¿Qué es el principio de "separación de preocupaciones"? |
El principio de separación de preocupaciones establece que diferentes responsabilidades o funcionalidades deben ser separadas en diferentes módulos o clases para mejorar la organización y la mantenibilidad del código. |
40. ¿Cómo se aplica la separación de preocupaciones en Java? |
public class OrderService {
private OrderRepository orderRepository;
public void processOrder(Order order) {
// Order processing logic
orderRepository.save(order);
}
}
public class OrderRepository {
public void save(Order order) {
// Save order to database
}
}
|
41. ¿Qué es el principio de "uso de excepciones para errores excepcionales"? |
El principio de uso de excepciones para errores excepcionales establece que las excepciones deben usarse solo para situaciones excepcionales y no para el control del flujo normal del programa. |
42. ¿Cómo se usan excepciones en Python? |
try:
result = 10 / 0
except ZeroDivisionError:
print("Cannot divide by zero")
# Avoid using exceptions for control flow
def calculate_division(a, b):
if b == 0:
raise ValueError("Cannot divide by zero")
return a / b
|
43. ¿Qué es el principio de "evitar el acoplamiento fuerte"? |
El principio de evitar el acoplamiento fuerte establece que las clases y módulos deben estar lo menos acoplados posible para facilitar el mantenimiento y la reutilización del código. |
44. ¿Cómo se evita el acoplamiento fuerte en C#? |
public interface IDataProvider
{
string GetData();
}
public class DataProvider : IDataProvider
{
public string GetData()
{
return "Data";
}
}
public class DataProcessor
{
private IDataProvider dataProvider;
public DataProcessor(IDataProvider dataProvider)
{
this.dataProvider = dataProvider;
}
public void Process()
{
string data = dataProvider.GetData();
// Process data
}
}
|
45. ¿Qué es el principio de "pruebas automatizadas"? |
El principio de pruebas automatizadas establece que las pruebas deben ser automatizadas siempre que sea posible para asegurar la calidad del software de manera eficiente y repetible. |
46. ¿Cómo se implementan pruebas automatizadas en Java? |
@Test
public void testCalculateArea() {
double result = calculateArea(5, 10);
assertEquals(50.0, result, 0.01);
}
|