/
alexander38com
/
RefactorCode
Обзор
Документация
Войти
/
alexander38com
/
RefactorCode
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
Code1
refprac1.cs
300 строк
9 KB
alexander38com
Prac1ver1
01 сен 2025, 11:31
01 сен 2025, 11:31
fa10a9d
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using System.Text.Json; namespace RefactoringExample { public class User { public string Name { get; set; } public int Age { get; set; } public double Discount { get; set; } public bool IsActive { get; set; } public bool IsVip { get; set; } public int OrdersCount { get; set; } } public class ReportConfiguration { public string ReportType { get; set; } = "detailed"; public string ReportGenerator { get; set; } = "Automated Reporting System"; } public interface IUserValidator { bool Validate(User user, out string errorMessage); } public class UserValidator : IUserValidator { public bool Validate(User user, out string errorMessage) { if (user.Age < 18) { errorMessage = "User is too young"; return false; } if (user.Name?.Length > 100) { errorMessage = "Name is too long"; return false; } errorMessage = string.Empty; return true; } } public interface IDiscountCalculator { double CalculateDiscount(User user); } public class DiscountCalculator : IDiscountCalculator { public double CalculateDiscount(User user) { if (user.IsVip) { return 0.15; } return user.OrdersCount > 5 ? 0.1 : 0; } } public interface IUserRepository { void Save(User user); } public class UserRepository : IUserRepository { private readonly List<User> _users = new List<User>(); public void Save(User user) { _users.Add(user); Console.WriteLine($"User saved: {JsonSerializer.Serialize(user)}"); } public IReadOnlyList<User> GetAllUsers() => _users.AsReadOnly(); } public interface IReportGenerator { void GenerateReport(User user, ReportConfiguration configuration); } public class ReportGenerator : IReportGenerator { public void GenerateReport(User user, ReportConfiguration configuration) { Console.WriteLine("Starting report generation..."); PrintReportHeader(user.Name, configuration.ReportType); PrintUserInformation(user); PrintDetailsSection(user); PrintRecommendations(user); PrintReportFooter(configuration); } private void PrintReportHeader(string userName, string reportType) { var reportTitle = GetReportTitle(reportType); Console.WriteLine(reportTitle); var header = $"Report for: {userName}"; Console.WriteLine(header); Console.WriteLine(new string('-', header.Length)); } private string GetReportTitle(string reportType) { return reportType switch { "detailed" => "=== DETAILED REPORT ===", "summary" => "=== SUMMARY REPORT ===", _ => "=== STANDARD REPORT ===" }; } private void PrintUserInformation(User user) { Console.WriteLine($"Age: {user.Age}"); Console.WriteLine($"Discount: {user.Discount:P0}"); Console.WriteLine($"Active status: {(user.IsActive ? "Active" : "Inactive")}"); Console.WriteLine($"Report date: {DateTime.Now:yyyy-MM-dd HH:mm:ss}"); } private void PrintDetailsSection(User user) { Console.WriteLine("\nDETAILS:"); Console.WriteLine("Account information:"); var customerDescription = GetCustomerDescription(user.Age, user.Discount); Console.WriteLine(customerDescription); PrintActivityStatus(user.IsActive); } private string GetCustomerDescription(int age, double discount) { if (age < 25) { return discount > 0.1 ? "Young customer with high discount" : "Young customer with standard discount"; } if (age < 40) { return discount > 0.15 ? "Adult customer with premium discount" : "Adult customer with standard discount"; } return discount > 0.2 ? "Senior customer with special discount" : "Senior customer with standard discount"; } private void PrintActivityStatus(bool isActive) { if (isActive) { Console.WriteLine("Customer is currently active"); Console.WriteLine($"Last activity: {DateTime.Now.AddDays(-7):yyyy-MM-dd}"); } else { Console.WriteLine("Customer is not active"); Console.WriteLine("Account will be archived soon"); } } private void PrintRecommendations(User user) { Console.WriteLine("\nRECOMMENDATIONS:"); var recommendation = GetRecommendation(user); if (!string.IsNullOrEmpty(recommendation)) { Console.WriteLine(recommendation); } } private string GetRecommendation(User user) { if (!user.IsActive && user.Age < 30) { return "Consider reactivation campaign for young inactive customer"; } if (user.IsActive && user.Discount < 0.05) { return "Consider loyalty program for active customer with low discount"; } if (user.Age > 60 && user.Discount < 0.1) { return "Consider senior discount program"; } return string.Empty; } private void PrintReportFooter(ReportConfiguration configuration) { Console.WriteLine("\n" + new string('=', 50)); Console.WriteLine($"Report generated by: {configuration.ReportGenerator}"); Console.WriteLine($"Generation timestamp: {DateTime.Now:yyyy-MM-dd HH:mm:ss}"); Console.WriteLine(new string('=', 50)); SaveReportIfNeeded(configuration.ReportType); Console.WriteLine($"Report completed at {DateTime.Now:HH:mm:ss}"); } private void SaveReportIfNeeded(string reportType) { if (reportType == "detailed") { Console.WriteLine("Saving detailed report to database..."); System.Threading.Thread.Sleep(100); Console.WriteLine("Report saved successfully"); } } } public class UserService { private readonly IUserValidator _userValidator; private readonly IDiscountCalculator _discountCalculator; private readonly IUserRepository _userRepository; private readonly IReportGenerator _reportGenerator; private readonly ReportConfiguration _configuration; public UserService( IUserValidator userValidator, IDiscountCalculator discountCalculator, IUserRepository userRepository, IReportGenerator reportGenerator, ReportConfiguration configuration) { _userValidator = userValidator; _discountCalculator = discountCalculator; _userRepository = userRepository; _reportGenerator = reportGenerator; _configuration = configuration; } public void ProcessUser(User user) { if (!_userValidator.Validate(user, out var errorMessage)) { Console.WriteLine(errorMessage); return; } user.Discount = _discountCalculator.CalculateDiscount(user); user.IsActive = true; _userRepository.Save(user); _reportGenerator.GenerateReport(user, _configuration); } } public class Program { static void Main(string[] args) { var configuration = new ReportConfiguration(); var userValidator = new UserValidator(); var discountCalculator = new DiscountCalculator(); var userRepository = new UserRepository(); var reportGenerator = new ReportGenerator(); var userService = new UserService( userValidator, discountCalculator, userRepository, reportGenerator, configuration); var user = new User { Name = "John Doe", Age = 25, IsVip = true, OrdersCount = 10 }; userService.ProcessUser(user); var discount = discountCalculator.CalculateDiscount(user); Console.WriteLine($"Calculated discount: {discount:P0}"); } } }