Ejercicio Lenguajes
Ahora, vamos a practicar identificando code smells en diferentes lenguajes. Para cada ejemplo:
- Identificar todos los code smells posibles
- Clasificarlos según la taxonomía vista anteriormente
- Explicar el impacto negativo de cada smell
- Proponer estrategias iniciales de refactorización
public class UserService {
private Database db;
private EmailSender emailSender;
private Logger logger;
private PasswordEncoder passwordEncoder;
public UserService() {
this.db = new Database("jdbc:mysql://localhost/users", "admin", "secret123");
this.emailSender = new EmailSender("smtp.company.com");
this.logger = new Logger("/var/log/users.log");
this.passwordEncoder = new PasswordEncoder();
}
public boolean registerUser(String username, String password, String email) {
logger.log("Attempting to register user: " + username);
// Validate input
if (username == null || username.length() < 3) {
logger.log("Invalid username: " + username);
return false;
}
if (password == null || password.length() < 8) {
logger.log("Password too short for user: " + username);
return false;
}
if (email == null || !email.contains("@")) {
logger.log("Invalid email for user: " + username);
return false;
}
// Check if user exists
String query = "SELECT * FROM users WHERE username = '" + username + "'";
ResultSet rs = db.executeQuery(query);
if (rs.next()) {
logger.log("Username already exists: " + username);
return false;
}
// Encode password and save user
String encodedPassword = passwordEncoder.encode(password);
String insertQuery = "INSERT INTO users (username, password, email) VALUES ('" +
username + "', '" + encodedPassword + "', '" + email + "')";
db.executeUpdate(insertQuery);
// Send welcome email
String subject = "Welcome to our platform";
String body = "Hi " + username + ",\n\nWelcome to our platform!";
emailSender.sendEmail(email, subject, body);
logger.log("User registered successfully: " + username);
return true;
}
public User getUserByUsername(String username) {
// Implementation...
}
public boolean changePassword(String username, String oldPassword, String newPassword) {
// Implementation...
}
public boolean resetPassword(String username) {
// Implementation...
}
public List<User> getAllUsers() {
// Implementation...
}
public boolean deleteUser(String username) {
// Implementation...
}
}
function processOrder(
userId,
items,
shippingAddress,
billingAddress,
paymentMethod,
couponCode,
giftWrap,
expressShipping,
insuranceRequired,
specialInstructions,
trackingPreference,
marketingOptIn
) {
// Validate user
if (!userId) {
console.error("User ID is required");
return null;
}
// Validate items
if (!items || items.length === 0) {
console.error("Order must contain at least one item");
return null;
}
// Calculate totals
let subtotal = 0;
for (const item of items) {
subtotal += item.price * item.quantity;
}
// Apply coupon if valid
let discount = 0;
if (couponCode) {
if (couponCode === "SAVE10") {
discount = subtotal * 0.1;
} else if (couponCode === "SAVE20") {
discount = subtotal * 0.2;
} else if (couponCode === "FREE-SHIPPING") {
expressShipping = false;
}
}
// Calculate shipping
let shippingCost = 0;
if (expressShipping) {
shippingCost = 15.99;
} else {
shippingCost = 5.99;
}
if (giftWrap) {
shippingCost += 4.99;
}
if (insuranceRequired) {
shippingCost += 2.99;
}
// Calculate final total
const total = subtotal - discount + shippingCost;
// Create order object
const order = {
userId,
items,
subtotal,
discount,
shippingCost,
total,
shippingAddress,
billingAddress,
paymentMethod,
giftWrap,
expressShipping,
insuranceRequired,
specialInstructions,
trackingPreference,
status: "pending",
createdAt: new Date()
};
// Process payment, store order in database, etc.
// ...
// Handle marketing opt-in
if (marketingOptIn) {
// Add user to marketing list
// ...
}
return order;
}
def generate_sales_report(start_date, end_date):
print("Generating Sales Report")
print("Period:", start_date, "to", end_date)
# Fetch sales data
sales_data = database.query(
f"SELECT * FROM sales WHERE date >= '{start_date}' AND date <= '{end_date}'"
)
# Calculate totals
total_sales = 0
total_items = 0
by_category = {}
for sale in sales_data:
total_sales += sale.amount
total_items += sale.quantity
category = sale.product_category
if category not in by_category:
by_category[category] = 0
by_category[category] += sale.amount
# Print report
print("\nSales Summary:")
print("Total Sales:", total_sales)
print("Total Items:", total_items)
print("Average Sale:", total_sales / len(sales_data) if sales_data else 0)
print("\nSales by Category:")
for category, amount in by_category.items():
print(f"{category}: ${amount}")
return {
"total_sales": total_sales,
"total_items": total_items,
"by_category": by_category
}
def generate_expense_report(start_date, end_date):
print("Generating Expense Report")
print("Period:", start_date, "to", end_date)
# Fetch expense data
expense_data = database.query(
f"SELECT * FROM expenses WHERE date >= '{start_date}' AND date <= '{end_date}'"
)
# Calculate totals
total_expenses = 0
by_category = {}
for expense in expense_data:
total_expenses += expense.amount
category = expense.category
if category not in by_category:
by_category[category] = 0
by_category[category] += expense.amount
# Print report
print("\nExpense Summary:")
print("Total Expenses:", total_expenses)
print("Average Expense:", total_expenses / len(expense_data) if expense_data else 0)
print("\nExpenses by Category:")
for category, amount in by_category.items():
print(f"{category}: ${amount}")
return {
"total_expenses": total_expenses,
"by_category": by_category
}
def generate_inventory_report(date):
print("Generating Inventory Report")
print("As of:", date)
# Fetch inventory data
inventory_data = database.query(
f"SELECT * FROM inventory WHERE last_updated <= '{date}'"
)
# Calculate totals
total_items = 0
total_value = 0
by_category = {}
for item in inventory_data:
total_items += item.quantity
item_value = item.quantity * item.price
total_value += item_value
category = item.category
if category not in by_category:
by_category[category] = 0
by_category[category] += item_value
# Print report
print("\nInventory Summary:")
print("Total Items:", total_items)
print("Total Value:", total_value)
print("\nInventory by Category:")
for category, value in by_category.items():
print(f"{category}: ${value}")
return {
"total_items": total_items,
"total_value": total_value,
"by_category": by_category
}
class PaymentProcessor {
fun processPayment(userId: String, amount: Double, paymentMethod: String): Int {
val user = getUserById(userId)
if (user == null) {
println("Error: User not found")
return -1
}
if (amount <= 0) {
println("Error: Invalid amount")
return -2
}
if (!isValidPaymentMethod(paymentMethod)) {
println("Error: Invalid payment method")
return -3
}
val balance = getUserBalance(userId)
if (balance < amount) {
println("Error: Insufficient funds")
return -4
}
if (paymentMethod == "credit_card") {
val result = processCreditCardPayment(user, amount)
if (result != 0) {
println("Error: Credit card processing failed")
return -5
}
} else if (paymentMethod == "bank_transfer") {
val result = processBankTransfer(user, amount)
if (result != 0) {
println("Error: Bank transfer failed")
return -6
}
} else if (paymentMethod == "digital_wallet") {
val result = processDigitalWallet(user, amount)
if (result != 0) {
println("Error: Digital wallet processing failed")
return -7
}
}
updateUserBalance(userId, balance - amount)
createTransactionRecord(userId, amount, paymentMethod)
println("Payment processed successfully")
return 0
}
private fun getUserById(userId: String): User? {
// Implementation...
return null // Placeholder
}
private fun isValidPaymentMethod(method: String): Boolean {
return method in listOf("credit_card", "bank_transfer", "digital_wallet")
}
private fun getUserBalance(userId: String): Double {
// Implementation...
return 0.0 // Placeholder
}
private fun processCreditCardPayment(user: User, amount: Double): Int {
// Implementation...
return 0 // Placeholder
}
private fun processBankTransfer(user: User, amount: Double): Int {
// Implementation...
return 0 // Placeholder
}
private fun processDigitalWallet(user: User, amount: Double): Int {
// Implementation...
return 0 // Placeholder
}
private fun updateUserBalance(userId: String, newBalance: Double) {
// Implementation...
}
private fun createTransactionRecord(userId: String, amount: Double, method: String) {
// Implementation...
}
}
public class CustomerService
{
private readonly Database _database;
public CustomerService(Database database)
{
_database = database;
}
public bool RegisterCustomer(string name, string email, string phone, string address)
{
// Validate name
if (string.IsNullOrEmpty(name) || name.Length < 2)
{
Console.WriteLine("Invalid name");
return false;
}
// Validate email
if (string.IsNullOrEmpty(email) || !email.Contains("@") || !email.Contains("."))
{
Console.WriteLine("Invalid email");
return false;
}
// Validate phone
if (string.IsNullOrEmpty(phone) || phone.Length < 10 || !phone.All(char.IsDigit))
{
Console.WriteLine("Invalid phone number");
return false;
}
// Check if email is already registered
string query = $"SELECT COUNT(*) FROM Customers WHERE Email = '{email}'";
int count = _database.ExecuteScalar<int>(query);
if (count > 0)
{
Console.WriteLine("Email already registered");
return false;
}
// Insert customer
string insertQuery = $@"
INSERT INTO Customers (Name, Email, Phone, Address, RegistrationDate)
VALUES ('{name}', '{email}', '{phone}', '{address}', '{DateTime.Now}')
";
bool success = _database.ExecuteNonQuery(insertQuery) > 0;
if (success)
{
Console.WriteLine("Customer registered successfully");
SendWelcomeEmail(name, email);
}
return success;
}
public bool UpdateCustomerAddress(string email, string newAddress)
{
if (string.IsNullOrEmpty(email) || !email.Contains("@"))
{
Console.WriteLine("Invalid email");
return false;
}
string query = $"UPDATE Customers SET Address = '{newAddress}' WHERE Email = '{email}'";
int rowsAffected = _database.ExecuteNonQuery(query);
if (rowsAffected == 0)
{
Console.WriteLine("Customer not found");
return false;
}
Console.WriteLine("Address updated successfully");
return true;
}
private void SendWelcomeEmail(string name, string email)
{
// Implementation...
Console.WriteLine($"Welcome email sent to {email}");
}
}