从题库到实践软件工程10个核心概念的代码级理解1. 耦合与内聚从理论到代码实现在软件工程中耦合和内聚是衡量模块设计质量的两个关键指标。让我们通过具体代码示例来理解这些抽象概念。1.1 耦合类型对比与代码示例耦合度从低到高可分为以下几种类型耦合类型描述代码示例数据耦合模块间仅通过参数传递基本数据类型processOrder(int orderId)标记耦合模块间通过复杂数据结构交互validateOrder(Order order)控制耦合模块间传递控制标志renderPage(bool isAdmin)外部耦合模块共享外部环境使用全局配置文件公共耦合模块访问相同全局数据使用全局变量globalConfig内容耦合模块直接修改另一模块内部数据直接操作另一模块的私有变量低耦合示例数据耦合def calculate_tax(amount): return amount * 0.1 # 10% tax def process_order(order_amount): tax calculate_tax(order_amount) # 仅通过基本数据类型交互 return order_amount tax高耦合示例内容耦合class Order: def __init__(self): self.__items [] # 私有变量 def modify_order_items(order): order.__items.clear() # 直接操作另一类的私有变量 - 危险提示在实际开发中应尽量保持数据耦合避免内容耦合。使用面向对象封装特性可以有效降低耦合度。1.2 内聚类型与代码实现内聚性从低到高可分为偶然内聚模块中的元素无逻辑关联# 工具类中不相关的方法 class Utility: def print_date(self): ... def calculate_tax(self): ... def connect_db(self): ...逻辑内聚执行逻辑相关的操作def process_data(input, operation): if operation encrypt: return encrypt(input) elif operation compress: return compress(input)时间内聚在同一时间段执行的操作def startup_system(): init_db() load_config() warmup_cache()过程内聚按特定流程顺序执行def process_order(): validate_order() calculate_total() process_payment() send_confirmation()通信内聚操作相同数据集def handle_user_data(user_id): profile get_profile(user_id) save_login_history(user_id) update_last_active(user_id)顺序内聚前一操作的输出是下一操作的输入def transform_data(input): cleaned clean_input(input) normalized normalize(cleaned) return encrypt(normalized)功能内聚所有元素共同完成单一功能理想状态def calculate_gcd(a, b): while b: a, b b, a % b return a重构低内聚代码示例# 重构前逻辑内聚 def handle_data(data, action): if action save: save_to_db(data) elif action log: write_to_log(data) elif action encrypt: return encrypt(data) # 重构后功能内聚 class DataProcessor: def save(self, data): ... def log(self, data): ... def encrypt(self, data): ...2. 软件测试白盒与黑盒的代码实践2.1 白盒测试技术实现白盒测试主要关注代码内部逻辑常见覆盖标准语句覆盖执行每行代码分支覆盖覆盖所有条件分支条件覆盖覆盖所有子条件路径覆盖覆盖所有执行路径测试示例函数def calculate_discount(customer_type, order_amount): discount 0 if customer_type VIP: if order_amount 1000: discount 0.2 else: discount 0.1 elif order_amount 500: discount 0.05 return order_amount * (1 - discount)对应测试用例设计测试用例customer_typeorder_amount覆盖目标1VIP1200VIP1000分支2VIP800VIP1000分支3Normal600非VIP500分支4Normal400非VIP500分支单元测试代码示例import unittest class TestDiscount(unittest.TestCase): def test_vip_large_order(self): self.assertAlmostEqual(calculate_discount(VIP, 1200), 960) def test_vip_small_order(self): self.assertAlmostEqual(calculate_discount(VIP, 800), 720) def test_normal_large_order(self): self.assertAlmostEqual(calculate_discount(Normal, 600), 570) def test_normal_small_order(self): self.assertAlmostEqual(calculate_discount(Normal, 400), 400) if __name__ __main__: unittest.main()2.2 黑盒测试实践黑盒测试主要技术等价类划分边界值分析决策表测试状态转换测试等价类划分示例 测试用户年龄验证允许18-60岁等价类范围有效/无效测试用例118无效17218-60有效30360无效614非数字无效abc边界值分析示例 对于范围18-60应测试17, 18, 19, 59, 60, 61决策表测试示例 登录系统决策表条件规则1规则2规则3规则4用户名有效TTFF密码正确TFTF结果成功密码错误用户不存在用户不存在3. 设计原则的代码体现3.1 SOLID原则实践单一职责原则(SRP)# 违反SRP class User: def __init__(self, name): ... def save(self): ... # 持久化逻辑 def send_email(self): ... # 通知逻辑 # 遵循SRP class User: def __init__(self, name): ... class UserRepository: def save(self, user): ... class EmailService: def send_email(self, user): ...开闭原则(OCP)# 违反OCP class ReportGenerator: def generate(self, format): if format PDF: self._generate_pdf() elif format HTML: self._generate_html() # 遵循OCP class ReportGenerator: def generate(self): pass class PDFReportGenerator(ReportGenerator): def generate(self): ... class HTMLReportGenerator(ReportGenerator): def generate(self): ...里氏替换原则(LSP)class Bird: def fly(self): ... # 违反LSP class Ostrich(Bird): def fly(self): raise Exception(Cant fly) # 子类改变了父类行为 # 遵循LSP class FlyingBird(Bird): def fly(self): ... class NonFlyingBird(Bird): def move(self): ... # 不继承fly方法 class Ostrich(NonFlyingBird): ...3.2 其他重要设计原则依赖倒置原则(DIP)示例# 高层模块不应依赖低层模块都应依赖抽象 class Database(ABC): abstractmethod def save(self, data): pass class MySQLDatabase(Database): def save(self, data): ... class UserService: def __init__(self, db: Database): # 依赖抽象 self.db db def create_user(self, user): self.db.save(user)接口隔离原则(ISP)示例# 违反ISP class MultiFunctionPrinter: def print(self): ... def scan(self): ... def fax(self): ... # 遵循ISP class Printer: def print(self): ... class Scanner: def scan(self): ... class FaxMachine: def fax(self): ... class SimplePrinter(Printer): ... class OfficePrinter(Printer, Scanner, FaxMachine): ...4. 设计模式的实战应用4.1 创建型模式示例工厂方法模式class Logger(ABC): abstractmethod def log(self, message): pass class FileLogger(Logger): def log(self, message): with open(log.txt, a) as f: f.write(message \n) class ConsoleLogger(Logger): def log(self, message): print(message) class LoggerFactory: staticmethod def get_logger(type) - Logger: if type file: return FileLogger() elif type console: return ConsoleLogger() raise ValueError(Invalid logger type) # 使用 logger LoggerFactory.get_logger(file) logger.log(Test message)单例模式实现class AppConfig: _instance None def __new__(cls): if cls._instance is None: cls._instance super().__new__(cls) cls._instance.load_config() return cls._instance def load_config(self): self.settings {debug: True, log_level: INFO} # 使用 config1 AppConfig() config2 AppConfig() print(config1 is config2) # True4.2 行为型模式示例策略模式class PaymentStrategy(ABC): abstractmethod def pay(self, amount): pass class CreditCardPayment(PaymentStrategy): def pay(self, amount): print(fPaid {amount} via Credit Card) class PayPalPayment(PaymentStrategy): def pay(self, amount): print(fPaid {amount} via PayPal) class Order: def __init__(self, payment_strategy: PaymentStrategy): self._payment_strategy payment_strategy def process_order(self, amount): self._payment_strategy.pay(amount) # 使用 order Order(CreditCardPayment()) order.process_order(100)观察者模式class Subject: def __init__(self): self._observers [] def attach(self, observer): self._observers.append(observer) def notify(self, message): for observer in self._observers: observer.update(message) class Observer(ABC): abstractmethod def update(self, message): pass class EmailAlert(Observer): def update(self, message): print(fEmail sent: {message}) class SMSAlert(Observer): def update(self, message): print(fSMS sent: {message}) # 使用 subject Subject() subject.attach(EmailAlert()) subject.attach(SMSAlert()) subject.notify(System started)5. 软件维护的代码考量5.1 维护类型与代码示例改正性维护修复bug# 修复前 def calculate_average(numbers): return sum(numbers) / len(numbers) # 可能除零错误 # 修复后 def calculate_average(numbers): if not numbers: return 0 return sum(numbers) / len(numbers)适应性维护适应环境变化# 旧代码 def connect_database(): return MySQLdb.connect(...) # 新需求支持PostgreSQL def connect_database(db_typemysql): if db_type mysql: return MySQLdb.connect(...) elif db_type postgres: return psycopg2.connect(...)完善性维护增强功能# 原始功能 class Logger: def log(self, message): with open(log.txt, a) as f: f.write(message \n) # 增强功能 class EnhancedLogger(Logger): def __init__(self): self.log_level INFO def log(self, message, levelINFO): if self._should_log(level): super().log(f[{level}] {message}) def _should_log(self, level): levels {DEBUG: 0, INFO: 1, WARNING: 2, ERROR: 3} return levels[level] levels[self.log_level]预防性维护提高可维护性# 重构前 def process_data(data): # 混合了数据清洗、转换和验证逻辑 if not data: return None cleaned [] for item in data: if isinstance(item, str): item item.strip() if item: cleaned.append(item.lower()) # ...更多处理逻辑 # 重构后 class DataProcessor: def __init__(self, data): self.data data def clean(self): self.data [item.strip() for item in self.data if item] def normalize(self): self.data [item.lower() for item in self.data] def validate(self): return all(isinstance(item, str) for item in self.data) def process(self): if not self.validate(): raise ValueError(Invalid data) self.clean() self.normalize() return self.data5.2 可维护性编码实践清晰的命名# 差 def proc(d): # ...处理数据 return r # 好 def process_user_data(user_data): # ...处理用户数据 return result适当的注释def calculate_interest(principal, rate, years): 计算复利利息 参数: principal: 本金 rate: 年利率(小数形式) years: 投资年限 返回: 投资总额(本金利息) return principal * (1 rate) ** years保持函数短小# 重构前 def handle_order(order): # 验证订单 if not order.items: raise ValueError(Empty order) for item in order.items: if item.quantity 0: raise ValueError(Invalid quantity) # 计算总额 total 0 for item in order.items: total item.price * item.quantity # 应用折扣 if order.customer.is_vip: total * 0.9 # 处理支付 if order.payment_method credit_card: process_credit_card(order.customer, total) elif order.payment_method paypal: process_paypal(order.customer, total) # 发送确认 send_confirmation_email(order.customer, order) # 更新库存 update_inventory(order.items) # 重构后 class OrderHandler: def __init__(self, order): self.order order def validate(self): if not self.order.items: raise ValueError(Empty order) for item in self.order.items: if item.quantity 0: raise ValueError(Invalid quantity) def calculate_total(self): subtotal sum(item.price * item.quantity for item in self.order.items) if self.order.customer.is_vip: subtotal * 0.9 return subtotal def process_payment(self): if self.order.payment_method credit_card: process_credit_card(self.order.customer, self.total) elif self.order.payment_method paypal: process_paypal(self.order.customer, self.total) def confirm_order(self): send_confirmation_email(self.order.customer, self.order) def update_inventory(self): update_inventory(self.order.items) def process(self): self.validate() self.total self.calculate_total() self.process_payment() self.confirm_order() self.update_inventory()