我们以设计一个简单的“在线书店系统”为例,结合软件工程的核心原理,使用UML、C/C++和Python来阐述。
1. 系统工程:整体最优原理
系统工程强调整体最优,而不是局部最优。在在线书店系统中,我们需要考虑用户界面、业务逻辑、数据库、支付系统、物流系统等多个子系统的协同工作,确保整个系统在性能、可靠性、可扩展性等方面达到最优。
UML示例:系统上下文图
C/C++示例:系统模块划分
// 整体系统架构,模块划分
// 用户界面模块
class UserInterface {
public:
void displayBooks(const std::vector<Book>& books);
Order collectOrder();
};
// 业务逻辑模块
class OrderProcessor {
public:
bool processOrder(const Order& order);
};
// 数据库模块
class Database {
public:
std::vector<Book> queryBooks(const std::string& query);
bool saveOrder(const Order& order);
};
// 支付接口模块
class PaymentGateway {
public:
bool chargePayment(const PaymentInfo& info);
};
// 物流接口模块
class ShippingService {
public:
bool shipOrder(const Order& order);
};
// 系统协调器(整体最优的体现)
class OnlineBookstore {
private:
UserInterface ui;
OrderProcessor processor;
Database db;
PaymentGateway payment;
ShippingService shipping;
public:
void run() {
// 协调各个模块,确保整体流程最优
auto books = db.queryBooks("C++");
ui.displayBooks(books);
Order order = ui.collectOrder();
if (processor.processOrder(order)) {
PaymentInfo info = order.getPaymentInfo();
if (payment.chargePayment(info)) {
shipping.shipOrder(order);
db.saveOrder(order);
}
}
}
};
Python示例:系统整合
# 使用微服务架构体现整体最优
# 每个服务独立部署,通过API协作,整体系统具有高可用性和可扩展性
# 用户服务
class UserService:
def get_user(self, user_id):
# 从用户数据库获取用户信息
pass
# 图书服务
class BookService:
def search_books(self, query):
# 从图书数据库搜索
pass
# 订单服务
class OrderService:
def create_order(self, user_id, book_ids):
# 创建订单,并调用支付服务和物流服务
pass
# 支付服务
class PaymentService:
def charge(self, order_id, amount):
# 调用第三方支付网关
pass
# 物流服务
class ShippingService:
def ship(self, order_id, address):
# 安排物流
pass
# 系统通过API网关整合
class APIGateway:
def __init__(self):
self.user_service = UserService()
self.book_service = BookService()
self.order_service = OrderService()
self.payment_service = PaymentService()
self.shipping_service = ShippingService()
def search_books(self, query):
return self.book_service.search_books(query)
def purchase(self, user_id, book_ids):
# 整体流程协调,确保事务性和一致性
order = self.order_service.create_order(user_id, book_ids)
self.payment_service.charge(order.id, order.amount)
self.shipping_service.ship(order.id, order.address)
return order
2. 软件工程:过程驱动原理
软件工程强调通过标准化的过程来保证质量。我们采用敏捷开发过程,包括需求分析、设计、编码、测试、部署等阶段,并使用持续集成和持续部署(CI/CD)来提高效率。
UML示例:活动图展示开发流程
C/C++示例:测试驱动开发(TDD)过程
// 测试驱动开发:先写测试,再写代码
// 1. 先写测试
#include <gtest/gtest.h>
#include "ShoppingCart.h"
TEST(ShoppingCartTest, AddItemIncreasesItemCount) {
ShoppingCart cart;
Book book1("The C++ Programming Language", 49.99);
cart.addItem(book1);
EXPECT_EQ(cart.getItemCount(), 1);
}
// 2. 然后实现代码
class ShoppingCart {
private:
std::vector<Book> items;
public:
void addItem(const Book& book) {
items.push_back(book);
}
int getItemCount() const {
return items.size();
}
};
// 3. 运行测试,通过后继续下一个测试
Python示例:持续集成脚本
# .travis.yml 或 GitHub Actions 脚本示例
language: python
python:
- "3.8"
install:
- pip install -r requirements.txt
- pip install pytest pytest-cov
script:
- pytest --cov=myapp tests/
- python -m myapp.database.migrations upgrade
# 自动化测试和部署
3. 架构设计:关注点分离原理
架构设计通过不同的视图(如逻辑视图、进程视图、物理视图等)来分离关注点,降低复杂性。在线书店系统中,我们采用分层架构,将表示层、业务逻辑层和数据访问层分离。
UML示例:分层架构图
C++示例:使用MVC模式分离关注点
// Model: 数据模型
class BookModel {
private:
std::string title;
double price;
public:
// getters and setters
};
// View: 显示
class BookView {
public:
void displayBookDetails(const BookModel& book) {
std::cout << "Title: " << book.getTitle() << std::endl;
std::cout << "Price: " << book.getPrice() << std::endl;
}
};
// Controller: 处理用户输入
class BookController {
private:
BookModel model;
BookView view;
public:
void setBookDetails(const std::string& title, double price) {
model.setTitle(title);
model.setPrice(price);
}
void updateView() {
view.displayBookDetails(model);
}
};
Python示例:使用Flask框架的分层架构
# 数据模型层(models.py)
from sqlalchemy import Column, String, Float
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Book(Base):
__tablename__ = 'books'
id = Column(String, primary_key=True)
title = Column(String)
price = Column(Float)
# 业务逻辑层(services.py)
class BookService:
def __init__(self, session):
self.session = session
def get_book_by_id(self, book_id):
return self.session.query(Book).filter_by(id=book_id).first()
def add_book(self, book):
self.session.add(book)
self.session.commit()
# 表示层(views.py)
from flask import Blueprint, jsonify, request
book_bp = Blueprint('book', __name__)
@book_bp.route('/book/<book_id>', methods=['GET'])
def get_book(book_id):
book = book_service.get_book_by_id(book_id)
return jsonify({'id': book.id, 'title': book.title, 'price': book.price})
4. 模式设计:复用经验原理
设计模式是解决常见问题的经验总结。在在线书店系统中,我们可以使用多种设计模式,例如工厂模式创建对象,观察者模式处理事件通知,单例模式管理全局配置等。
UML示例:观察者模式类图
C++示例:使用观察者模式实现订单状态通知
// 观察者接口
class OrderObserver {
public:
virtual ~OrderObserver() = default;
virtual void update(const std::string& status) = 0;
};
// 主题:订单
class Order {
private:
std::string status;
std::vector<OrderObserver*> observers;
public:
void attach(OrderObserver* observer) {
observers.push_back(observer);
}
void setStatus(const std::string& newStatus) {
status = newStatus;
notify();
}
void notify() {
for (auto observer : observers) {
observer->update(status);
}
}
};
// 具体观察者:用户通知
class UserNotifier : public OrderObserver {
public:
void update(const std::string& status) override {
std::cout << "Notifying user: Order status changed to " << status << std::endl;
}
};
// 具体观察者:库存管理系统
class InventoryManager : public OrderObserver {
public:
void update(const std::string& status) override {
if (status == "shipped") {
std::cout << "Updating inventory for shipped order." << std::endl;
}
}
};
Python示例:使用工厂模式创建支付对象
# 工厂模式
class PaymentMethod:
def pay(self, amount):
pass
class CreditCardPayment(PaymentMethod):
def pay(self, amount):
print(f"Paying {amount} via Credit Card")
class PayPalPayment(PaymentMethod):
def pay(self, amount):
print(f"Paying {amount} via PayPal")
class PaymentFactory:
@staticmethod
def create_payment(method_type):
if method_type == "credit_card":
return CreditCardPayment()
elif method_type == "paypal":
return PayPalPayment()
else:
raise ValueError("Unknown payment method")
# 使用工厂
payment = PaymentFactory.create_payment("credit_card")
payment.pay(100.0)
5. 建模设计:抽象简化原理
建模通过抽象来简化复杂系统。我们可以使用类图来描述系统的静态结构,使用状态图来描述对象的状态变化,使用序列图来描述对象之间的交互。
UML示例:类图展示在线书店的核心类
C++示例:使用抽象类定义接口
// 抽象类:商品
class Product {
public:
virtual ~Product() = default;
virtual std::string getDescription() const = 0;
virtual double getPrice() const = 0;
};
// 具体商品:图书
class Book : public Product {
private:
std::string title;
std::string author;
double price;
public:
Book(const std::string& title, const std::string& author, double price)
: title(title), author(author), price(price) {}
std::string getDescription() const override {
return title + " by " + author;
}
double getPrice() const override {
return price;
}
};
// 购物车可以处理任意Product
class ShoppingCart {
private:
std::vector<Product*> items;
public:
void addItem(Product* product) {
items.push_back(product);
}
double calculateTotal() const {
double total = 0.0;
for (const auto& item : items) {
total += item->getPrice();
}
return total;
}
};
Python示例:使用抽象基类
from abc import ABC, abstractmethod
# 抽象基类
class Product(ABC):
@abstractmethod
def get_description(self):
pass
@abstractmethod
def get_price(self):
pass
# 具体类
class Book(Product):
def __init__(self, title, author, price):
self.title = title
self.author = author
self.price = price
def get_description(self):
return f"{self.title} by {self.author}"
def get_price(self):
return self.price
# 使用抽象基类确保一致性
def print_product_info(product: Product):
print(product.get_description())
print(f"Price: {product.get_price()}")
6. UML设计:可视化表达原理
UML通过标准图形语言来沟通设计思想。我们可以使用多种UML图来全方位描述系统。
UML示例:序列图展示用户购书流程
C++示例:对应序列图的代码框架
// 对应序列图中的各个对象
class UserInterface {
public:
void browseBooks() {
// 显示图书
Inventory inventory;
auto books = inventory.queryBooks();
displayBooks(books);
// 添加商品到购物车
ShoppingCart cart;
cart.addItem(selectedBook);
// 结账
checkout(cart);
}
void checkout(ShoppingCart& cart) {
Order order = Order::createOrder(cart);
PaymentResult result = PaymentGateway::processPayment(order);
if (result.success) {
order.confirm();
displayOrderConfirmation(order);
}
}
};
Python示例:使用时序图描述微服务调用
# 使用序列图描述服务间调用
# 用户服务调用订单服务,订单服务调用支付服务和库存服务
# 用户服务中的函数
def purchase_book(user_id, book_id):
# 调用订单服务
order_response = order_service.create_order(user_id, book_id)
# 调用支付服务
payment_response = payment_service.charge(order_response['order_id'])
# 调用库存服务
inventory_response = inventory_service.update_stock(book_id, -1)
return {
'order': order_response,
'payment': payment_response,
'inventory': inventory_response
}
7. 代码实现:精确执行原理
代码实现是将设计准确转化为可执行代码的过程。需要遵循编码规范,进行单元测试,确保代码质量。
UML示例:组件图展示代码模块的依赖关系
C++示例:遵循编码规范的实现
// 遵循Google C++ Style Guide的示例
#include <string>
#include <vector>
namespace online_bookstore {
// 类名使用大驼峰,函数名使用小驼峰
class ShoppingCart {
public:
// 构造函数使用explicit防止隐式转换
explicit ShoppingCart(int max_items);
// 使用const正确性
int GetItemCount() const;
// 使用引用避免拷贝
void AddItem(const Book& book);
// 返回const引用
const std::vector<Book>& GetItems() const;
private:
// 成员变量以下划线结尾
std::vector<Book> items_;
int max_items_;
};
// 内联简单函数
inline int ShoppingCart::GetItemCount() const {
return items_.size();
}
} // namespace online_bookstore
Python示例:使用类型注解和单元测试
# 使用类型注解提高代码可读性和可维护性
from typing import List, Optional
class ShoppingCart:
def __init__(self, max_items: int) -> None:
self.items: List[Book] = []
self.max_items = max_items
def add_item(self, book: Book) -> None:
if len(self.items) < self.max_items:
self.items.append(book)
else:
raise ValueError("Cart is full")
def get_item_count(self) -> int:
return len(self.items)
# 单元测试
import unittest
class TestShoppingCart(unittest.TestCase):
def test_add_item(self):
cart = ShoppingCart(10)
book = Book("Python Crash Course", 39.99)
cart.add_item(book)
self.assertEqual(cart.get_item_count(), 1)
def test_cart_full(self):
cart = ShoppingCart(1)
book1 = Book("Book 1", 10.0)
book2 = Book("Book 2", 20.0)
cart.add_item(book1)
with self.assertRaises(ValueError):
cart.add_item(book2)
if __name__ == '__main__':
unittest.main()
总结
通过以上示例,我们可以看到软件工程的核心原理如何在实际项目中应用:
-
系统工程:强调整体最优,通过系统架构和模块划分来实现。
-
软件工程:通过标准化的开发过程和测试来保证质量。
-
架构设计:通过分层和分离关注点来管理复杂性。
-
模式设计:复用设计模式解决常见问题。
-
建模设计:使用UML等建模语言抽象和简化系统。
-
UML设计:通过可视化图形沟通设计思想。
-
代码实现:将设计精确转化为可执行代码,并保证代码质量。
这些原理相互关联,共同构成了软件工程的基础。在实际项目中,需要根据具体情况灵活应用这些原理。
软件工程核心工作机制与原理详解
UML 体系架构总览
1. 系统工程:整体最优原理
UML 系统上下文图
C/C++ 实现:整体最优的系统架构
// ==================== 1. 系统整体架构 ====================
// system_architecture.h
#ifndef SYSTEM_ARCHITECTURE_H
#define SYSTEM_ARCHITECTURE_H
#include <vector>
#include <memory>
#include <string>
#include <map>
// 系统组件接口 - 定义所有系统组件的通用行为
class SystemComponent {
protected:
std::string name;
double resourceWeight; // 资源权重,用于整体优化
std::vector<SystemComponent*> dependencies;
public:
SystemComponent(const std::string& name, double weight = 1.0)
: name(name), resourceWeight(weight) {}
virtual ~SystemComponent() = default;
virtual void initialize() = 0;
virtual void start() = 0;
virtual void stop() = 0;
virtual void cleanup() = 0;
virtual double getResourceUsage() const = 0;
virtual std::string getStatus() const = 0;
void addDependency(SystemComponent* component) {
dependencies.push_back(component);
}
const std::vector<SystemComponent*>& getDependencies() const {
return dependencies;
}
std::string getName() const { return name; }
double getResourceWeight() const { return resourceWeight; }
};
// ==================== 2. 系统优化器 ====================
class SystemOptimizer {
private:
struct OptimizationConstraint {
double maxTotalResources;
double minPerformanceScore;
std::map<std::string, double> componentLimits;
};
struct OptimizationResult {
std::map<std::string, double> componentSettings;
double totalResourceUsage;
double performanceScore;
bool feasible;
std::string reasoning;
};
std::vector<SystemComponent*> components;
OptimizationConstraint constraints;
// 多目标优化函数
OptimizationResult optimizeParetoFront() {
OptimizationResult bestResult;
bestResult.performanceScore = 0;
bestResult.totalResourceUsage = std::numeric_limits<double>::max();
bestResult.feasible = false;
// 模拟退火算法寻找帕累托最优解
double temperature = 1000.0;
double coolingRate = 0.95;
auto currentConfig = generateRandomConfiguration();
auto currentScore = evaluateConfiguration(currentConfig);
while (temperature > 1.0) {
auto newConfig = mutateConfiguration(currentConfig);
auto newScore = evaluateConfiguration(newConfig);
// 接受更好的解,或者以一定概率接受较差的解
if (newScore.feasible && (newScore.performanceScore > currentScore.performanceScore ||
(acceptanceProbability(currentScore.performanceScore,
newScore.performanceScore, temperature) >
randomDouble(0.0, 1.0)))) {
currentConfig = newConfig;
currentScore = newScore;
// 更新最佳解(帕累托最优)
if (isParetoOptimal(newScore, bestResult)) {
bestResult = newScore;
}
}
temperature *= coolingRate;
}
return bestResult;
}
bool isParetoOptimal(const OptimizationResult& newResult,
const OptimizationResult& bestResult) const {
// 帕累托最优判断:一个解在不使其他目标变坏的情况下,至少有一个目标变得更好
if (!bestResult.feasible && newResult.feasible) return true;
if (newResult.performanceScore > bestResult.performanceScore &&
newResult.totalResourceUsage <= bestResult.totalResourceUsage) {
return true;
}
return false;
}
public:
void addComponent(SystemComponent* component) {
components.push_back(component);
}
void setConstraints(const OptimizationConstraint& constraints) {
this->constraints = constraints;
}
// 执行整体系统优化
void optimize() {
std::cout << "Starting system-wide optimization..." << std::endl;
// 1. 分析组件依赖关系
analyzeDependencies();
// 2. 收集性能数据
collectPerformanceData();
// 3. 执行多目标优化
auto result = optimizeParetoFront();
// 4. 应用优化结果
applyOptimization(result);
std::cout << "System optimization completed. Performance score: "
<< result.performanceScore << std::endl;
}
private:
void analyzeDependencies() {
std::map<std::string, int> dependencyLevel;
std::vector<std::string> topologicalOrder;
// 拓扑排序确定启动顺序
for (auto comp : components) {
for (auto dep : comp->getDependencies()) {
dependencyLevel[comp->getName()]++;
}
}
std::cout << "Dependency analysis complete. Found "
<< components.size() << " components." << std::endl;
}
void collectPerformanceData() {
for (auto comp : components) {
std::cout << "Component: " << comp->getName()
<< ", Resource usage: " << comp->getResourceUsage()
<< ", Status: " << comp->getStatus() << std::endl;
}
}
};
// ==================== 3. 具体系统组件实现 ====================
class DatabaseComponent : public SystemComponent {
private:
int connectionPoolSize;
int cacheSizeMB;
bool replicationEnabled;
public:
DatabaseComponent() : SystemComponent("Database", 2.0) {
connectionPoolSize = 10;
cacheSizeMB = 100;
replicationEnabled = false;
}
void initialize() override {
std::cout << "Initializing database with "
<< connectionPoolSize << " connections" << std::endl;
}
double getResourceUsage() const override {
// 综合考虑连接数、缓存大小等
return connectionPoolSize * 0.1 + cacheSizeMB * 0.01;
}
std::string getStatus() const override {
return replicationEnabled ? "Replicated" : "Standalone";
}
// 可配置参数用于优化
void setConnectionPoolSize(int size) { connectionPoolSize = size; }
void setCacheSize(int mb) { cacheSizeMB = mb; }
void enableReplication(bool enable) { replicationEnabled = enable; }
};
class CacheComponent : public SystemComponent {
private:
double hitRate;
int maxEntries;
std::string evictionPolicy;
public:
CacheComponent() : SystemComponent("Cache", 1.5) {
hitRate = 0.0;
maxEntries = 1000;
evictionPolicy = "LRU";
}
void initialize() override {
std::cout << "Initializing cache with "
<< maxEntries << " entries, policy: "
<< evictionPolicy << std::endl;
}
double getResourceUsage() const override {
// 内存使用估计
return maxEntries * 0.001;
}
std::string getStatus() const override {
return std::to_string(static_cast<int>(hitRate * 100)) + "% hit rate";
}
void setMaxEntries(int entries) { maxEntries = entries; }
void setEvictionPolicy(const std::string& policy) { evictionPolicy = policy; }
};
// ==================== 4. 系统协调器 ====================
class SystemCoordinator {
private:
std::vector<std::unique_ptr<SystemComponent>> components;
SystemOptimizer optimizer;
std::map<std::string, std::string> configuration;
public:
SystemCoordinator() {
// 初始化系统组件
initializeComponents();
// 配置优化约束
configureOptimization();
}
void startSystem() {
std::cout << "=== Starting System with Overall Optimization ===" << std::endl;
// 1. 执行系统级优化
optimizer.optimize();
// 2. 按依赖顺序初始化组件
initializeComponentsInOrder();
// 3. 启动所有组件
for (auto& comp : components) {
comp->start();
}
std::cout << "=== System Started Successfully ===" << std::endl;
}
void stopSystem() {
std::cout << "Stopping system..." << std::endl;
// 反向顺序停止组件
for (auto it = components.rbegin(); it != components.rend(); ++it) {
(*it)->stop();
}
}
private:
void initializeComponents() {
// 创建组件
auto db = std::make_unique<DatabaseComponent>();
auto cache = std::make_unique<CacheComponent>();
// 设置依赖关系:缓存依赖于数据库
cache->addDependency(db.get());
// 添加到优化器
optimizer.addComponent(db.get());
optimizer.addComponent(cache.get());
// 保存所有权
components.push_back(std::move(db));
components.push_back(std::move(cache));
}
void configureOptimization() {
SystemOptimizer::OptimizationConstraint constraints;
constraints.maxTotalResources = 5.0; // 最大资源限制
constraints.minPerformanceScore = 80.0; // 最低性能得分
optimizer.setConstraints(constraints);
}
void initializeComponentsInOrder() {
// 简化版拓扑排序初始化
std::vector<SystemComponent*> initialized;
while (initialized.size() < components.size()) {
for (auto& comp : components) {
// 检查是否所有依赖都已初始化
bool dependenciesSatisfied = true;
for (auto dep : comp->getDependencies()) {
if (std::find(initialized.begin(), initialized.end(), dep) == initialized.end()) {
dependenciesSatisfied = false;
break;
}
}
if (dependenciesSatisfied &&
std::find(initialized.begin(), initialized.end(), comp.get()) == initialized.end()) {
comp->initialize();
initialized.push_back(comp.get());
}
}
}
}
};
// ==================== 5. 使用示例 ====================
int main() {
SystemCoordinator coordinator;
try {
coordinator.startSystem();
// 模拟系统运行
std::this_thread::sleep_for(std::chrono::seconds(10));
coordinator.stopSystem();
} catch (const std::exception& e) {
std::cerr << "System error: " << e.what() << std::endl;
return 1;
}
return 0;
}
Python 实现:整体最优的微服务系统
# ==================== 1. 系统整体架构 ====================
# system_optimizer.py
from typing import Dict, List, Tuple, Optional
from dataclasses import dataclass
from abc import ABC, abstractmethod
import math
import random
@dataclass
class SystemMetric:
"""系统度量指标"""
response_time: float # 响应时间(ms)
throughput: float # 吞吐量(req/s)
resource_usage: float # 资源使用率(%)
availability: float # 可用性(%)
cost: float # 成本(单位)
def overall_score(self, weights: Dict[str, float]) -> float:
"""计算整体得分"""
# 归一化处理
normalized = {
'response_time': max(0, 1 - self.response_time / 1000),
'throughput': min(1, self.throughput / 1000),
'resource_usage': max(0, 1 - self.resource_usage / 100),
'availability': self.availability / 100,
'cost': max(0, 1 - self.cost / 1000)
}
# 加权求和
score = sum(normalized[k] * weights.get(k, 0) for k in normalized)
return score * 100 # 转换为百分制
class SystemComponent(ABC):
"""系统组件基类"""
def __init__(self, name: str, weight: float = 1.0):
self.name = name
self.weight = weight
self.dependencies: List['SystemComponent'] = []
self.metrics: SystemMetric = None
def add_dependency(self, component: 'SystemComponent'):
self.dependencies.append(component)
@abstractmethod
async def initialize(self):
pass
@abstractmethod
async def process(self, request) -> any:
pass
@abstractmethod
def collect_metrics(self) -> SystemMetric:
pass
# ==================== 2. 多目标优化器 ====================
class MultiObjectiveOptimizer:
"""多目标优化器 - 寻找帕累托最优解"""
def __init__(self, objectives: List[str], constraints: Dict[str, Tuple[float, float]]):
self.objectives = objectives # 优化目标列表
self.constraints = constraints # 约束条件
self.solutions: List[Dict] = [] # 帕累托最优解集
def optimize(self,
components: List[SystemComponent],
iterations: int = 1000) -> List[Dict]:
"""
使用NSGA-II算法进行多目标优化
"""
# 初始化种群
population = self._initialize_population(components)
for gen in range(iterations):
# 评估适应度
evaluated = self._evaluate_population(population, components)
# 非支配排序
fronts = self._non_dominated_sort(evaluated)
# 计算拥挤度
self._calculate_crowding_distance(fronts)
# 选择、交叉、变异
new_population = self._selection(fronts, len(population))
new_population = self._crossover(new_population)
new_population = self._mutation(new_population)
population = new_population
# 更新帕累托前沿
self._update_pareto_front(fronts[0])
if gen % 100 == 0:
print(f"Generation {gen}: Pareto front size = {len(self.solutions)}")
return self.solutions
def _initialize_population(self, components: List[SystemComponent]) -> List[Dict]:
"""初始化种群"""
population = []
for _ in range(100):
config = {}
for comp in components:
config[comp.name] = {
'replicas': random.randint(1, 5),
'resources': {
'cpu': random.uniform(0.1, 2.0),
'memory': random.uniform(128, 2048)
},
'strategy': random.choice(['round_robin', 'least_conn', 'random'])
}
population.append(config)
return population
def _evaluate_population(self, population: List[Dict],
components: List[SystemComponent]) -> List[Dict]:
"""评估种群适应度"""
evaluated = []
for config in population:
# 计算目标函数值
objectives = self._calculate_objectives(config, components)
# 检查约束
feasible = self._check_constraints(config, components)
evaluated.append({
'config': config,
'objectives': objectives,
'feasible': feasible
})
return evaluated
def _non_dominated_sort(self, population: List[Dict]) -> List[List[Dict]]:
"""非支配排序"""
fronts = []
remaining = population.copy()
while remaining:
current_front = []
for i, p in enumerate(remaining):
dominated = False
to_remove = []
for j, q in enumerate(remaining):
if i != j:
if self._dominates(p['objectives'], q['objectives']):
to_remove.append(j)
elif self._dominates(q['objectives'], p['objectives']):
dominated = True
break
if not dominated:
current_front.append(p)
# 移除被支配的解
for idx in sorted(to_remove, reverse=True):
remaining.pop(idx)
fronts.append(current_front)
remaining = [p for p in remaining if p not in current_front]
return fronts
def _dominates(self, obj1: Dict[str, float], obj2: Dict[str, float]) -> bool:
"""判断解1是否支配解2"""
better_in_one = False
for obj in self.objectives:
if obj1[obj] < obj2[obj]: # 假设都是最小化目标
return False
elif obj1[obj] > obj2[obj]:
better_in_one = True
return better_in_one
# ==================== 3. 具体组件实现 ====================
class DatabaseService(SystemComponent):
"""数据库服务组件"""
def __init__(self):
super().__init__("database", weight=2.0)
self.connection_pool = 10
self.replication_factor = 1
self.cache_enabled = True
async def initialize(self):
print(f"Initializing {self.name} with {self.connection_pool} connections")
await self._setup_connections()
async def process(self, query: str) -> any:
# 模拟数据库处理
import asyncio
await asyncio.sleep(0.01 * len(query) / 100)
return {"result": "data", "rows": 100}
def collect_metrics(self) -> SystemMetric:
# 模拟收集指标
return SystemMetric(
response_time=50 + random.random() * 100,
throughput=500 + random.random() * 500,
resource_usage=30 + random.random() * 40,
availability=99.9,
cost=self.connection_pool * 0.1 + self.replication_factor * 0.5
)
async def _setup_connections(self):
# 模拟建立数据库连接
await asyncio.sleep(0.1)
def configure(self, pool_size: int, replication: int, cache: bool):
self.connection_pool = pool_size
self.replication_factor = replication
self.cache_enabled = cache
class CacheService(SystemComponent):
"""缓存服务组件"""
def __init__(self):
super().__init__("cache", weight=1.5)
self.max_size_mb = 1024
self.eviction_policy = "LRU"
self.cluster_size = 1
async def initialize(self):
print(f"Initializing {self.name} with {self.max_size_mb}MB cache")
await self._setup_cache()
async def process(self, key: str) -> any:
# 模拟缓存访问
hit_rate = 0.8 # 假设命中率80%
import random
if random.random() < hit_rate:
return {"hit": True, "data": "cached_value"}
else:
return {"hit": False}
def collect_metrics(self) -> SystemMetric:
# 模拟收集指标
return SystemMetric(
response_time=5 + random.random() * 10,
throughput=2000 + random.random() * 3000,
resource_usage=20 + random.random() * 30,
availability=99.99,
cost=self.max_size_mb * 0.01 + self.cluster_size * 0.2
)
async def _setup_cache(self):
await asyncio.sleep(0.05)
# ==================== 4. 系统整体协调器 ====================
class SystemOrchestrator:
"""系统协调器 - 实现整体最优"""
def __init__(self):
self.components: Dict[str, SystemComponent] = {}
self.optimizer = MultiObjectiveOptimizer(
objectives=['response_time', 'cost', 'resource_usage'],
constraints={
'response_time': (0, 1000),
'availability': (99, 100),
'cost': (0, 1000)
}
)
self.optimal_config = None
def register_component(self, component: SystemComponent):
self.components[component.name] = component
async def optimize_system(self):
"""执行系统级优化"""
print("Starting system-wide optimization...")
# 1. 收集当前状态
current_metrics = await self._collect_system_metrics()
# 2. 执行多目标优化
components_list = list(self.components.values())
solutions = self.optimizer.optimize(components_list)
# 3. 选择最佳配置(考虑权重)
self.optimal_config = self._select_best_config(solutions)
# 4. 应用优化配置
await self._apply_configuration(self.optimal_config)
# 5. 验证优化效果
new_metrics = await self._collect_system_metrics()
improvement = self._calculate_improvement(current_metrics, new_metrics)
print(f"Optimization complete. Improvement: {improvement:.2f}%")
return self.optimal_config
async def _collect_system_metrics(self) -> Dict[str, SystemMetric]:
"""收集系统整体指标"""
metrics = {}
total_metric = SystemMetric(0, 0, 0, 100, 0)
for name, comp in self.components.items():
metric = comp.collect_metrics()
metrics[name] = metric
# 加权汇总
total_metric.response_time += metric.response_time * comp.weight
total_metric.throughput += metric.throughput * comp.weight
total_metric.resource_usage += metric.resource_usage * comp.weight
total_metric.availability = min(total_metric.availability, metric.availability)
total_metric.cost += metric.cost * comp.weight
metrics['system'] = total_metric
return metrics
def _select_best_config(self, solutions: List[Dict]) -> Dict:
"""选择最佳配置(考虑业务优先级)"""
if not solutions:
return {}
# 业务权重:响应时间 > 成本 > 资源使用率
weights = {
'response_time': 0.5,
'cost': 0.3,
'resource_usage': 0.2
}
best_solution = None
best_score = -float('inf')
for solution in solutions:
# 计算加权得分
score = 0
for obj, weight in weights.items():
# 假设solution['objectives']包含目标值
if obj in solution.get('objectives', {}):
# 归一化并加权
normalized = 1 / (1 + solution['objectives'][obj])
score += normalized * weight
if score > best_score:
best_score = score
best_solution = solution
return best_solution
async def _apply_configuration(self, config: Dict):
"""应用优化后的配置"""
if not config:
return
print("Applying optimal configuration...")
for comp_name, comp_config in config.get('config', {}).items():
if comp_name in self.components:
component = self.components[comp_name]
# 根据组件类型应用配置
if isinstance(component, DatabaseService):
component.configure(
pool_size=comp_config.get('replicas', 1) * 10,
replication=comp_config.get('replicas', 1),
cache=True
)
elif isinstance(component, CacheService):
component.max_size_mb = comp_config.get('resources', {}).get('memory', 1024) / 2
component.cluster_size = comp_config.get('replicas', 1)
# 重新初始化组件
await component.initialize()
# ==================== 5. 使用示例 ====================
async def main():
# 创建系统协调器
orchestrator = SystemOrchestrator()
# 注册系统组件
db_service = DatabaseService()
cache_service = CacheService()
# 设置依赖关系
cache_service.add_dependency(db_service)
orchestrator.register_component(db_service)
orchestrator.register_component(cache_service)
# 初始化所有组件
for component in orchestrator.components.values():
await component.initialize()
# 执行系统级优化
optimal_config = await orchestrator.optimize_system()
print(f"\nOptimal configuration:")
for comp, config in optimal_config.get('config', {}).items():
print(f" {comp}: {config}")
# 模拟系统运行
print("\nSimulating system operation...")
for _ in range(10):
# 处理请求
result = await cache_service.process("user:123")
print(f"Cache result: {result}")
import asyncio
await asyncio.sleep(0.1)
print("\nSystem optimization completed successfully!")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
2. 软件工程:过程驱动原理
UML 软件开发过程模型
C/C++ 实现:过程驱动的开发框架
// ==================== 1. 软件开发过程框架 ====================
// development_process.h
#ifndef DEVELOPMENT_PROCESS_H
#define DEVELOPMENT_PROCESS_H
#include <iostream>
#include <vector>
#include <memory>
#include <chrono>
#include <map>
// 软件开发阶段枚举
enum class DevelopmentPhase {
REQUIREMENTS,
DESIGN,
IMPLEMENTATION,
TESTING,
DEPLOYMENT,
MAINTENANCE
};
// 质量门禁
class QualityGate {
private:
std::string name;
double threshold;
bool mandatory;
public:
QualityGate(const std::string& name, double threshold, bool mandatory = true)
: name(name), threshold(threshold), mandatory(mandatory) {}
virtual ~QualityGate() = default;
virtual bool evaluate(const std::map<std::string, double>& metrics) const {
auto it = metrics.find(name);
if (it == metrics.end()) {
return !mandatory; // 非强制门禁可以跳过
}
return it->second >= threshold;
}
std::string getName() const { return name; }
double getThreshold() const { return threshold; }
bool isMandatory() const { return mandatory; }
};
// 开发阶段基类
class DevelopmentStage {
protected:
DevelopmentPhase phase;
std::string name;
std::vector<QualityGate> qualityGates;
std::chrono::system_clock::time_point startTime;
std::chrono::system_clock::time_point endTime;
bool completed;
public:
DevelopmentStage(DevelopmentPhase phase, const std::string& name)
: phase(phase), name(name), completed(false) {
startTime = std::chrono::system_clock::now();
}
virtual ~DevelopmentStage() = default;
virtual void execute() = 0;
virtual void validate() = 0;
void addQualityGate(const QualityGate& gate) {
qualityGates.push_back(gate);
}
bool passQualityGates(const std::map<std::string, double>& metrics) const {
for (const auto& gate : qualityGates) {
if (!gate.evaluate(metrics)) {
std::cerr << "Quality gate failed: " << gate.getName() << std::endl;
return false;
}
}
return true;
}
void complete() {
endTime = std::chrono::system_clock::now();
completed = true;
auto duration = std::chrono::duration_cast<std::chrono::minutes>(endTime - startTime);
std::cout << "Stage '" << name << "' completed in "
<< duration.count() << " minutes" << std::endl;
}
bool isCompleted() const { return completed; }
DevelopmentPhase getPhase() const { return phase; }
};
// ==================== 2. 具体开发阶段实现 ====================
class RequirementsStage : public DevelopmentStage {
private:
std::vector<std::string> userStories;
std::map<std::string, std::string> acceptanceCriteria;
public:
RequirementsStage() : DevelopmentStage(DevelopmentPhase::REQUIREMENTS, "Requirements") {
// 定义需求阶段的质量门禁
addQualityGate(QualityGate("user_stories_count", 3));
addQualityGate(QualityGate("acceptance_criteria_coverage", 0.8));
}
void execute() override {
std::cout << "=== Executing Requirements Stage ===" << std::endl;
// 收集用户故事
collectUserStories();
// 定义验收标准
defineAcceptanceCriteria();
// 创建产品待办列表
createProductBacklog();
std::cout << "Requirements stage execution completed." << std::endl;
}
void validate() override {
std::cout << "=== Validating Requirements ===" << std::endl;
std::map<std::string, double> metrics;
metrics["user_stories_count"] = userStories.size();
metrics["acceptance_criteria_coverage"] = calculateCoverage();
if (passQualityGates(metrics)) {
std::cout << "Requirements validation passed!" << std::endl;
complete();
} else {
std::cerr << "Requirements validation failed!" << std::endl;
}
}
private:
void collectUserStories() {
// 模拟收集用户故事
userStories = {
"As a user, I want to search for products",
"As a user, I want to add products to cart",
"As a user, I want to checkout and pay",
"As an admin, I want to manage inventory"
};
std::cout << "Collected " << userStories.size() << " user stories." << std::endl;
}
void defineAcceptanceCriteria() {
// 为每个用户故事定义验收标准
for (const auto& story : userStories) {
acceptanceCriteria[story] = "Criteria defined for: " + story;
}
}
void createProductBacklog() {
std::cout << "Created product backlog with "
<< userStories.size() << " items." << std::endl;
}
double calculateCoverage() const {
// 计算验收标准覆盖率
if (userStories.empty()) return 0.0;
return static_cast<double>(acceptanceCriteria.size()) / userStories.size();
}
};
class ImplementationStage : public DevelopmentStage {
private:
std::vector<std::string> tasks;
int completedTasks;
public:
ImplementationStage() : DevelopmentStage(DevelopmentPhase::IMPLEMENTATION, "Implementation"),
completedTasks(0) {
// 定义实现阶段的质量门禁
addQualityGate(QualityGate("code_coverage", 0.7));
addQualityGate(QualityGate("static_analysis_score", 8.0));
addQualityGate(QualityGate("unit_test_passed", 0.95));
}
void execute() override {
std::cout << "=== Executing Implementation Stage ===" << std::endl;
// 任务分解
decomposeTasks();
// 编码实现
implementFeatures();
// 单元测试
runUnitTests();
std::cout << "Implementation stage execution completed." << std::endl;
}
void validate() override {
std::cout << "=== Validating Implementation ===" << std::endl;
std::map<std::string, double> metrics;
metrics["code_coverage"] = measureCodeCoverage();
metrics["static_analysis_score"] = runStaticAnalysis();
metrics["unit_test_passed"] = getTestPassRate();
if (passQualityGates(metrics)) {
std::cout << "Implementation validation passed!" << std::endl;
complete();
} else {
std::cerr << "Implementation validation failed!" << std::endl;
}
}
private:
void decomposeTasks() {
// 模拟任务分解
tasks = {
"Implement product search API",
"Implement shopping cart service",
"Implement payment integration",
"Write unit tests",
"Perform code review"
};
std::cout << "Decomposed into " << tasks.size() << " tasks." << std::endl;
}
void implementFeatures() {
// 模拟实现过程
for (const auto& task : tasks) {
std::cout << "Implementing: " << task << std::endl;
// 模拟实现时间
std::this_thread::sleep_for(std::chrono::milliseconds(100));
completedTasks++;
}
}
void runUnitTests() {
std::cout << "Running unit tests..." << std::endl;
// 模拟测试执行
std::this_thread::sleep_for(std::chrono::milliseconds(200));
}
double measureCodeCoverage() const {
// 模拟代码覆盖率测量
return 0.85; // 85% coverage
}
double runStaticAnalysis() const {
// 模拟静态分析
return 9.2; // 评分 9.2/10
}
double getTestPassRate() const {
// 模拟测试通过率
return 0.96; // 96% passed
}
};
// ==================== 3. 过程管理器 ====================
class ProcessManager {
private:
std::vector<std::unique_ptr<DevelopmentStage>> stages;
DevelopmentPhase currentPhase;
std::map<std::string, double> processMetrics;
public:
ProcessManager() : currentPhase(DevelopmentPhase::REQUIREMENTS) {
initializeStages();
}
void runProcess() {
std::cout << "=== Starting Software Development Process ===" << std::endl;
for (auto& stage : stages) {
if (!stage->isCompleted()) {
std::cout << "\n>>> Entering phase: "
<< getPhaseName(stage->getPhase()) << std::endl;
// 执行阶段
stage->execute();
// 验证阶段成果
stage->validate();
// 收集过程指标
collectMetrics(stage.get());
// 检查是否继续
if (!stage->isCompleted()) {
std::cerr << "Process stopped at phase: "
<< getPhaseName(stage->getPhase()) << std::endl;
break;
}
currentPhase = stage->getPhase();
}
}
if (allStagesCompleted()) {
std::cout << "\n=== Software Development Process Completed Successfully! ===" << std::endl;
printProcessMetrics();
}
}
private:
void initializeStages() {
// 定义标准开发阶段
stages.push_back(std::make_unique<RequirementsStage>());
stages.push_back(std::make_unique<ImplementationStage>());
// 可以添加更多阶段:设计、测试、部署等
}
void collectMetrics(DevelopmentStage* stage) {
auto phaseName = getPhaseName(stage->getPhase());
processMetrics[phaseName + "_duration"] =
std::chrono::duration_cast<std::chrono::minutes>(
std::chrono::system_clock::now() - stage->startTime
).count();
}
bool allStagesCompleted() const {
for (const auto& stage : stages) {
if (!stage->isCompleted()) {
return false;
}
}
return true;
}
std::string getPhaseName(DevelopmentPhase phase) const {
switch (phase) {
case DevelopmentPhase::REQUIREMENTS: return "Requirements";
case DevelopmentPhase::DESIGN: return "Design";
case DevelopmentPhase::IMPLEMENTATION: return "Implementation";
case DevelopmentPhase::TESTING: return "Testing";
case DevelopmentPhase::DEPLOYMENT: return "Deployment";
case DevelopmentPhase::MAINTENANCE: return "Maintenance";
default: return "Unknown";
}
}
void printProcessMetrics() const {
std::cout << "\n=== Process Metrics ===" << std::endl;
for (const auto& [key, value] : processMetrics) {
std::cout << key << ": " << value << std::endl;
}
}
};
// ==================== 4. CI/CD 流水线 ====================
class CICDPipeline {
private:
struct PipelineStage {
std::string name;
std::function<bool()> action;
std::vector<std::string> dependencies;
bool required;
};
std::vector<PipelineStage> stages;
std::map<std::string, bool> stageResults;
public:
CICDPipeline() {
initializePipeline();
}
bool run() {
std::cout << "=== Starting CI/CD Pipeline ===" << std::endl;
std::vector<std::string> executedStages;
while (executedStages.size() < stages.size()) {
bool progress = false;
for (const auto& stage : stages) {
// 检查是否已执行
if (stageResults.find(stage.name) != stageResults.end()) {
continue;
}
// 检查依赖是否满足
bool dependenciesMet = true;
for (const auto& dep : stage.dependencies) {
if (stageResults.find(dep) == stageResults.end() ||
!stageResults[dep]) {
dependenciesMet = false;
break;
}
}
if (dependenciesMet) {
std::cout << "\n>>> Running stage: " << stage.name << std::endl;
bool success = stage.action();
stageResults[stage.name] = success;
if (!success && stage.required) {
std::cerr << "Pipeline failed at stage: " << stage.name << std::endl;
return false;
}
executedStages.push_back(stage.name);
progress = true;
}
}
if (!progress) {
std::cerr << "Pipeline deadlock detected!" << std::endl;
return false;
}
}
std::cout << "\n=== CI/CD Pipeline Completed Successfully ===" << std::endl;
return true;
}
private:
void initializePipeline() {
// 定义流水线阶段
stages.push_back({
"Code Checkout",
[]() {
std::cout << "Checking out code from repository..." << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
return true;
},
{}, // 无依赖
true
});
stages.push_back({
"Build",
[]() {
std::cout << "Building project..." << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(200));
return true;
},
{"Code Checkout"},
true
});
stages.push_back({
"Unit Tests",
[]() {
std::cout << "Running unit tests..." << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(150));
// 模拟测试失败
bool testsPassed = (rand() % 10) != 0; // 90% 通过率
if (!testsPassed) {
std::cerr << "Unit tests failed!" << std::endl;
}
return testsPassed;
},
{"Build"},
true
});
stages.push_back({
"Integration Tests",
[]() {
std::cout << "Running integration tests..." << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(250));
return true;
},
{"Unit Tests"},
true
});
stages.push_back({
"Code Analysis",
[]() {
std::cout << "Performing static code analysis..." << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
return true;
},
{"Build"},
false // 非强制
});
stages.push_back({
"Deploy to Staging",
[]() {
std::cout << "Deploying to staging environment..." << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(300));
return true;
},
{"Integration Tests"},
true
});
stages.push_back({
"Deploy to Production",
[]() {
std::cout << "Deploying to production environment..." << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(500));
return true;
},
{"Deploy to Staging"},
true
});
}
};
// ==================== 5. 使用示例 ====================
int main() {
std::cout << "=== Software Engineering: Process-Driven Development ===" << std::endl;
// 1. 运行开发过程
std::cout << "\n1. Running Development Process:" << std::endl;
ProcessManager processManager;
processManager.runProcess();
// 2. 运行CI/CD流水线
std::cout << "\n2. Running CI/CD Pipeline:" << std::endl;
CICDPipeline pipeline;
bool pipelineSuccess = pipeline.run();
if (pipelineSuccess) {
std::cout << "\n=== All Processes Completed Successfully ===" << std::endl;
return 0;
} else {
std::cerr << "\n=== Process Failed ===" << std::endl;
return 1;
}
}
Python 实现:敏捷开发过程与CI/CD
# ==================== 1. 敏捷开发过程框架 ====================
# agile_process.py
from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from typing import List, Dict, Optional, Callable
from datetime import datetime, timedelta
from enum import Enum
import asyncio
class SprintPhase(Enum):
"""冲刺阶段"""
PLANNING = "planning"
DEVELOPMENT = "development"
REVIEW = "review"
RETROSPECTIVE = "retrospective"
class UserStoryStatus(Enum):
"""用户故事状态"""
BACKLOG = "backlog"
TODO = "todo"
IN_PROGRESS = "in_progress"
REVIEW = "review"
DONE = "done"
ACCEPTED = "accepted"
@dataclass
class UserStory:
"""用户故事"""
id: str
title: str
description: str
acceptance_criteria: List[str]
story_points: int
priority: int
status: UserStoryStatus = UserStoryStatus.BACKLOG
assignee: Optional[str] = None
started_at: Optional[datetime] = None
completed_at: Optional[datetime] = None
def start(self, assignee: str):
self.status = UserStoryStatus.IN_PROGRESS
self.assignee = assignee
self.started_at = datetime.now()
def complete(self):
self.status = UserStoryStatus.DONE
self.completed_at = datetime.now()
def calculate_cycle_time(self) -> Optional[float]:
if self.started_at and self.completed_at:
return (self.completed_at - self.started_at).total_seconds() / 3600 # 小时
return None
@dataclass
class Sprint:
"""冲刺"""
id: int
name: str
start_date: datetime
end_date: datetime
goal: str
velocity: int = 0
phase: SprintPhase = SprintPhase.PLANNING
user_stories: List[UserStory] = field(default_factory=list)
daily_standups: List[Dict] = field(default_factory=list)
def add_user_story(self, story: UserStory):
self.user_stories.append(story)
def calculate_velocity(self) -> int:
completed_stories = [s for s in self.user_stories
if s.status == UserStoryStatus.ACCEPTED]
return sum(s.story_points for s in completed_stories)
def burn_down_chart(self) -> Dict[datetime, int]:
"""生成燃尽图数据"""
burn_down = {}
remaining_points = sum(s.story_points for s in self.user_stories)
# 模拟每天剩余点数
current_date = self.start_date
while current_date <= self.end_date:
# 假设每天完成一定比例
completed_today = len([s for s in self.user_stories
if s.completed_at and
s.completed_at.date() == current_date.date()])
remaining_points -= completed_today * 5 # 假设每个故事5点
burn_down[current_date] = max(0, remaining_points)
current_date += timedelta(days=1)
return burn_down
# ==================== 2. 敏捷团队与角色 ====================
class TeamMember(ABC):
"""团队成员基类"""
def __init__(self, name: str, role: str):
self.name = name
self.role = role
@abstractmethod
def work(self, sprint: Sprint) -> Dict:
pass
class ProductOwner(TeamMember):
"""产品负责人"""
def __init__(self, name: str):
super().__init__(name, "Product Owner")
self.product_backlog: List[UserStory] = []
def work(self, sprint: Sprint) -> Dict:
print(f"{self.name} (Product Owner) is prioritizing backlog...")
# 优先级排序
self.product_backlog.sort(key=lambda x: x.priority, reverse=True)
# 选择下一个冲刺的故事
available_capacity = sprint.velocity if sprint.velocity > 0 else 20
selected_stories = []
total_points = 0
for story in self.product_backlog:
if total_points + story.story_points <= available_capacity:
selected_stories.append(story)
total_points += story.story_points
else:
break
# 从待办列表移除已选故事
for story in selected_stories:
self.product_backlog.remove(story)
sprint.add_user_story(story)
return {
"action": "prioritized_backlog",
"stories_selected": len(selected_stories),
"total_points": total_points
}
def add_user_story(self, story: UserStory):
self.product_backlog.append(story)
def accept_story(self, story: UserStory) -> bool:
"""验收用户故事"""
print(f"{self.name} is reviewing story: {story.title}")
# 检查验收标准
all_criteria_met = all(self._check_criterion(c) for c in story.acceptance_criteria)
if all_criteria_met:
story.status = UserStoryStatus.ACCEPTED
print(f"Story '{story.title}' accepted!")
return True
else:
print(f"Story '{story.title}' rejected - criteria not met")
return False
def _check_criterion(self, criterion: str) -> bool:
# 模拟验收检查
import random
return random.random() > 0.2 # 80% 通过率
class ScrumMaster(TeamMember):
"""Scrum Master"""
def __init__(self, name: str):
super().__init__(name, "Scrum Master")
def work(self, sprint: Sprint) -> Dict:
print(f"{self.name} (Scrum Master) is facilitating sprint {sprint.phase.value}...")
actions = []
if sprint.phase == SprintPhase.PLANNING:
actions.append(self.facilitate_planning(sprint))
elif sprint.phase == SprintPhase.DEVELOPMENT:
actions.append(self.facilitate_daily_standup(sprint))
elif sprint.phase == SprintPhase.REVIEW:
actions.append(self.facilitate_review(sprint))
elif sprint.phase == SprintPhase.RETROSPECTIVE:
actions.append(self.facilitate_retrospective(sprint))
return {"actions": actions}
def facilitate_daily_standup(self, sprint: Sprint) -> str:
"""主持每日站会"""
standup = {
"date": datetime.now(),
"attendees": [],
"updates": []
}
sprint.daily_standups.append(standup)
return f"Facilitated daily standup on {standup['date'].strftime('%Y-%m-%d')}"
def facilitate_retrospective(self, sprint: Sprint) -> str:
"""主持回顾会议"""
# 收集反馈
feedback = {
"what_went_well": [],
"what_can_be_improved": [],
"action_items": []
}
# 分析冲刺数据
velocity = sprint.calculate_velocity()
cycle_times = []
for story in sprint.user_stories:
if story.status == UserStoryStatus.ACCEPTED:
ct = story.calculate_cycle_time()
if ct:
cycle_times.append(ct)
avg_cycle_time = sum(cycle_times) / len(cycle_times) if cycle_times else 0
# 生成改进项
if avg_cycle_time > 24: # 如果平均周期时间超过24小时
feedback["what_can_be_improved"].append("Reduce cycle time")
feedback["action_items"].append("Implement pair programming")
if velocity < 15: # 如果速度低于15点
feedback["what_can_be_improved"].append("Increase velocity")
feedback["action_items"].append("Break down stories smaller")
return f"Facilitated retrospective. Velocity: {velocity}, Avg Cycle Time: {avg_cycle_time:.1f}h"
class Developer(TeamMember):
"""开发人员"""
def __init__(self, name: str, skills: List[str]):
super().__init__(name, "Developer")
self.skills = skills
self.current_story: Optional[UserStory] = None
def work(self, sprint: Sprint) -> Dict:
if self.current_story:
# 继续当前故事
return self._work_on_current_story()
else:
# 领取新故事
return self._pick_new_story(sprint)
def _work_on_current_story(self) -> Dict:
print(f"{self.name} is working on: {self.current_story.title}")
import random
progress = random.uniform(0.1, 0.3) # 每次进展10-30%
# 模拟工作
asyncio.sleep(0.1)
# 检查是否完成
if progress >= 1.0 or random.random() > 0.8: # 80% 完成率
self.current_story.complete()
print(f"{self.name} completed: {self.current_story.title}")
completed_story = self.current_story
self.current_story = None
return {
"action": "completed_story",
"story_id": completed_story.id,
"story_points": completed_story.story_points
}
return {
"action": "progress_on_story",
"story_id": self.current_story.id,
"progress": progress
}
def _pick_new_story(self, sprint: Sprint) -> Dict:
# 查找可领取的故事
available_stories = [s for s in sprint.user_stories
if s.status == UserStoryStatus.TODO]
if not available_stories:
return {"action": "no_available_stories"}
# 选择最优先的故事
story = min(available_stories, key=lambda x: x.priority)
story.start(self.name)
self.current_story = story
print(f"{self.name} started working on: {story.title}")
return {
"action": "started_story",
"story_id": story.id,
"title": story.title
}
# ==================== 3. CI/CD 流水线 ====================
class CICDPipeline:
"""持续集成/持续部署流水线"""
def __init__(self):
self.stages = []
self.history = []
self._initialize_pipeline()
def _initialize_pipeline(self):
"""初始化流水线阶段"""
self.stages = [
{
"name": "Code Quality Check",
"action": self._code_quality_check,
"required": True,
"timeout": 60
},
{
"name": "Unit Tests",
"action": self._run_unit_tests,
"required": True,
"timeout": 120
},
{
"name": "Integration Tests",
"action": self._run_integration_tests,
"required": True,
"timeout": 180
},
{
"name": "Security Scan",
"action": self._security_scan,
"required": False,
"timeout": 90
},
{
"name": "Build Docker Image",
"action": self._build_docker_image,
"required": True,
"timeout": 150
},
{
"name": "Deploy to Staging",
"action": self._deploy_to_staging,
"required": True,
"timeout": 120
},
{
"name": "Smoke Tests",
"action": self._run_smoke_tests,
"required": True,
"timeout": 60
},
{
"name": "Deploy to Production",
"action": self._deploy_to_production,
"required": True,
"timeout": 300
}
]
async def run(self, commit_hash: str, branch: str = "main") -> bool:
"""运行流水线"""
print(f"\n=== Starting CI/CD Pipeline for {branch}@{commit_hash[:8]} ===")
pipeline_start = datetime.now()
results = []
for i, stage in enumerate(self.stages):
print(f"\n[{i+1}/{len(self.stages)}] Running: {stage['name']}")
try:
# 执行阶段
start_time = datetime.now()
success = await asyncio.wait_for(
stage["action"](commit_hash, branch),
timeout=stage["timeout"]
)
duration = (datetime.now() - start_time).total_seconds()
result = {
"stage": stage["name"],
"success": success,
"duration": duration,
"required": stage["required"],
"timestamp": datetime.now()
}
results.append(result)
print(f" Result: {'✅ PASS' if success else '❌ FAIL'} ({duration:.1f}s)")
# 如果阶段失败且是必需的,停止流水线
if not success and stage["required"]:
print(f"\n🚨 Pipeline failed at stage: {stage['name']}")
break
except asyncio.TimeoutError:
print(f" ❌ TIMEOUT after {stage['timeout']}s")
results.append({
"stage": stage["name"],
"success": False,
"duration": stage["timeout"],
"required": stage["required"],
"timeout": True,
"timestamp": datetime.now()
})
break
# 记录流水线执行历史
pipeline_result = {
"commit_hash": commit_hash,
"branch": branch,
"start_time": pipeline_start,
"end_time": datetime.now(),
"results": results,
"overall_success": all(r["success"] for r in results if r["required"])
}
self.history.append(pipeline_result)
# 生成报告
self._generate_report(pipeline_result)
return pipeline_result["overall_success"]
async def _code_quality_check(self, commit_hash: str, branch: str) -> bool:
"""代码质量检查"""
await asyncio.sleep(1)
# 模拟代码质量检查
import random
quality_score = random.uniform(7.0, 10.0)
if quality_score < 8.0:
print(f" ⚠️ Code quality score: {quality_score:.1f}/10.0")
return False
print(f" Code quality score: {quality_score:.1f}/10.0")
return True
async def _run_unit_tests(self, commit_hash: str, branch: str) -> bool:
"""运行单元测试"""
await asyncio.sleep(2)
# 模拟单元测试
import random
test_count = random.randint(50, 200)
passed = random.randint(int(test_count * 0.95), test_count) # 95-100% 通过率
coverage = random.uniform(0.7, 0.95)
print(f" Unit tests: {passed}/{test_count} passed")
print(f" Code coverage: {coverage:.1%}")
return passed == test_count and coverage >= 0.8
async def _deploy_to_production(self, commit_hash: str, branch: str) -> bool:
"""部署到生产环境"""
await asyncio.sleep(3)
# 模拟蓝绿部署
print(" Deploying using blue-green deployment...")
# 检查健康状态
healthy = await self._check_health()
if healthy:
print(" ✅ Production deployment successful")
return True
else:
print(" ❌ Production deployment failed - rolling back")
await self._rollback_deployment()
return False
async def _check_health(self) -> bool:
"""检查服务健康状态"""
await asyncio.sleep(0.5)
import random
return random.random() > 0.1 # 90% 健康概率
async def _rollback_deployment(self):
"""回滚部署"""
await asyncio.sleep(1)
print(" Rollback completed")
def _generate_report(self, result: Dict):
"""生成流水线报告"""
print(f"\n=== CI/CD Pipeline Report ===")
print(f"Commit: {result['commit_hash'][:8]}")
print(f"Branch: {result['branch']}")
print(f"Duration: {(result['end_time'] - result['start_time']).total_seconds():.1f}s")
print(f"Overall: {'✅ SUCCESS' if result['overall_success'] else '❌ FAILED'}")
print("\nStage Results:")
for r in result["results"]:
status = "✅" if r["success"] else "❌"
if r.get("timeout"):
status = "⏰"
print(f" {status} {r['stage']}: {r['duration']:.1f}s")
# ==================== 4. 敏捷项目管理器 ====================
class AgileProjectManager:
"""敏捷项目管理器"""
def __init__(self, project_name: str, sprint_duration_days: int = 14):
self.project_name = project_name
self.sprint_duration = sprint_duration_days
self.sprints: List[Sprint] = []
self.current_sprint: Optional[Sprint] = None
self.team_members: List[TeamMember] = []
self.pipeline = CICDPipeline()
def add_team_member(self, member: TeamMember):
self.team_members.append(member)
def start_sprint(self, sprint_id: int, goal: str):
"""开始新的冲刺"""
start_date = datetime.now()
end_date = start_date + timedelta(days=self.sprint_duration)
sprint = Sprint(
id=sprint_id,
name=f"Sprint {sprint_id}",
start_date=start_date,
end_date=end_date,
goal=goal,
phase=SprintPhase.PLANNING
)
self.current_sprint = sprint
self.sprints.append(sprint)
print(f"\n=== Started {sprint.name} ===")
print(f"Goal: {goal}")
print(f"Duration: {start_date.strftime('%Y-%m-%d')} to {end_date.strftime('%Y-%m-%d')}")
return sprint
async def run_sprint(self):
"""运行冲刺周期"""
if not self.current_sprint:
print("No active sprint!")
return
print(f"\n=== Running {self.current_sprint.name} ===")
# 冲刺计划阶段
print("\n--- Sprint Planning ---")
self.current_sprint.phase = SprintPhase.PLANNING
# 产品负责人准备冲刺待办列表
po = next((m for m in self.team_members if isinstance(m, ProductOwner)), None)
if po:
po.work(self.current_sprint)
# 开发阶段
print("\n--- Sprint Development ---")
self.current_sprint.phase = SprintPhase.DEVELOPMENT
# 模拟每日迭代
current_day = self.current_sprint.start_date
while current_day <= self.current_sprint.end_date:
print(f"\nDay {(current_day - self.current_sprint.start_date).days + 1}:")
# 每日站会
scrum_master = next((m for m in self.team_members
if isinstance(m, ScrumMaster)), None)
if scrum_master:
scrum_master.work(self.current_sprint)
# 团队成员工作
for member in self.team_members:
if isinstance(member, Developer):
result = member.work(self.current_sprint)
# 如果完成了故事,触发CI/CD
if result.get("action") == "completed_story":
await self._trigger_ci_cd(f"story_{result['story_id']}")
current_day += timedelta(days=1)
await asyncio.sleep(0.1) # 模拟时间流逝
# 冲刺评审
print("\n--- Sprint Review ---")
self.current_sprint.phase = SprintPhase.REVIEW
if po:
# 验收完成的故事
for story in self.current_sprint.user_stories:
if story.status == UserStoryStatus.DONE:
po.accept_story(story)
# 计算冲刺速度
velocity = self.current_sprint.calculate_velocity()
print(f"\nSprint Velocity: {velocity} story points")
# 冲刺回顾
print("\n--- Sprint Retrospective ---")
self.current_sprint.phase = SprintPhase.RETROSPECTIVE
if scrum_master:
result = scrum_master.work(self.current_sprint)
print(f"Improvements identified: {result}")
print(f"\n=== {self.current_sprint.name} Completed ===")
async def _trigger_ci_cd(self, trigger: str):
"""触发CI/CD流水线"""
import hashlib
import random
# 生成模拟提交哈希
commit_hash = hashlib.sha256(f"{trigger}_{random.random()}".encode()).hexdigest()[:16]
print(f"\n🔧 Triggering CI/CD for {trigger} ({commit_hash[:8]})...")
success = await self.pipeline.run(commit_hash, "feature-branch")
if success:
print(f"✅ CI/CD succeeded for {trigger}")
else:
print(f"❌ CI/CD failed for {trigger}")
# ==================== 5. 使用示例 ====================
async def main():
print("=== Software Engineering: Process-Driven Development ===")
# 创建敏捷项目
project = AgileProjectManager("E-Commerce Platform", sprint_duration_days=7)
# 组建团队
po = ProductOwner("Alice")
scrum_master = ScrumMaster("Bob")
dev1 = Developer("Charlie", ["backend", "api"])
dev2 = Developer("Diana", ["frontend", "ui"])
dev3 = Developer("Eve", ["devops", "database"])
project.add_team_member(po)
project.add_team_member(scrum_master)
project.add_team_member(dev1)
project.add_team_member(dev2)
project.add_team_member(dev3)
# 创建用户故事
user_stories = [
UserStory(
id="US-001",
title="User Registration",
description="As a new user, I want to register an account",
acceptance_criteria=["Can register with email", "Email verification sent", "Password strength check"],
story_points=5,
priority=1
),
UserStory(
id="US-002",
title="Product Search",
description="As a user, I want to search for products",
acceptance_criteria=["Search by keyword", "Filter by category", "Sort results"],
story_points=8,
priority=2
),
UserStory(
id="US-003",
title="Shopping Cart",
description="As a user, I want to add products to cart",
acceptance_criteria=["Add/remove items", "Update quantities", "Calculate total"],
story_points=13,
priority=1
),
UserStory(
id="US-004",
title="Checkout Process",
description="As a user, I want to checkout and pay",
acceptance_criteria=["Enter shipping info", "Select payment method", "Order confirmation"],
story_points=21,
priority=3
)
]
# 添加到产品待办列表
for story in user_stories:
po.add_user_story(story)
# 运行多个冲刺
for sprint_num in range(1, 4):
print(f"\n{'='*50}")
print(f"Starting Sprint {sprint_num}")
print('='*50)
project.start_sprint(sprint_num, f"Implement e-commerce features - Sprint {sprint_num}")
await project.run_sprint()
print(f"\nSprint {sprint_num} metrics:")
sprint = project.sprints[-1]
print(f" Stories completed: {len([s for s in sprint.user_stories if s.status == UserStoryStatus.ACCEPTED])}")
print(f" Velocity: {sprint.calculate_velocity()}")
if sprint_num < 3:
await asyncio.sleep(0.5) # 冲刺间间隔
print(f"\n{'='*50}")
print("Project Summary:")
print('='*50)
total_stories = 0
total_points = 0
for sprint in project.sprints:
completed = len([s for s in sprint.user_stories if s.status == UserStoryStatus.ACCEPTED])
velocity = sprint.calculate_velocity()
print(f"Sprint {sprint.id}: {completed} stories, {velocity} points")
total_stories += completed
total_points += velocity
print(f"\nTotal: {total_stories} stories, {total_points} points delivered")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
由于篇幅限制,我将为其余原理(3-7)提供简化的实现框架。每个原理都可以按照类似的模式扩展。
3. 架构设计:关注点分离原理
UML 架构视图
graph TB
subgraph "逻辑视图"
A1[用户界面] --> B1[控制器]
B1 --> C1[服务层]
C1 --> D1[数据访问层]
D1 --> E1[数据库]
end
subgraph "开发视图"
A2[frontend/] --> B2[backend/]
B2 --> C2[services/]
C2 --> D2[models/]
D2 --> E2[repositories/]
end
subgraph "进程视图"
A3[Web服务器] --> B3[应用服务器]
B3 --> C3[缓存服务器]
C3 --> D3[数据库集群]
end
subgraph "物理视图"
A4[负载均衡器] --> B4[应用服务器集群]
B4 --> C4[Redis集群]
C4 --> D4[MySQL主从]
end
C++ 实现:关注点分离的架构
// ==================== 1. 分层架构 ====================
// 表示层
class UserInterface {
public:
virtual void display(const std::string& data) = 0;
virtual std::string getInput() = 0;
};
// 业务逻辑层
class BusinessService {
public:
virtual std::string processRequest(const std::string& request) = 0;
};
// 数据访问层
class DataAccess {
public:
virtual std::string queryData(const std::string& query) = 0;
virtual void saveData(const std::string& data) = 0;
};
// ==================== 2. 清洁架构 ====================
// 实体层(核心业务逻辑)
class OrderEntity {
private:
std::string orderId;
double totalAmount;
std::vector<std::string> items;
public:
double calculateTotal() const {
// 核心业务逻辑
return totalAmount * 1.1; // 加10%税
}
};
// 用例层(应用特定逻辑)
class ProcessOrderUseCase {
private:
OrderRepository& repository;
PaymentService& paymentService;
public:
bool execute(const OrderEntity& order) {
// 1. 验证订单
if (!validateOrder(order)) return false;
// 2. 处理支付
if (!paymentService.processPayment(order.calculateTotal())) return false;
// 3. 保存订单
repository.save(order);
return true;
}
};
// 接口适配层
class OrderRepository {
public:
virtual void save(const OrderEntity& order) = 0;
virtual OrderEntity findById(const std::string& id) = 0;
};
// 框架和驱动层
class DatabaseOrderRepository : public OrderRepository {
private:
DatabaseConnection& db;
public:
void save(const OrderEntity& order) override {
// 数据库具体实现
db.execute("INSERT INTO orders ...");
}
};
Python 实现:清洁架构
# ==================== 1. 领域层(核心业务逻辑) ====================
# entities.py
class Order:
def __init__(self, order_id: str, items: List['OrderItem']):
self.order_id = order_id
self.items = items
self.status = "pending"
def calculate_total(self) -> Decimal:
"""核心业务逻辑:计算订单总额"""
subtotal = sum(item.price * item.quantity for item in self.items)
tax = subtotal * Decimal('0.1') # 10%税
return subtotal + tax
def can_be_cancelled(self) -> bool:
"""业务规则:判断订单是否能取消"""
return self.status in ["pending", "confirmed"]
# ==================== 2. 用例层(应用逻辑) ====================
# use_cases.py
class ProcessOrderUseCase:
def __init__(self,
order_repo: 'OrderRepository',
payment_gateway: 'PaymentGateway',
inventory_service: 'InventoryService'):
self.order_repo = order_repo
self.payment_gateway = payment_gateway
self.inventory_service = inventory_service
def execute(self, order: Order) -> bool:
"""处理订单的用例"""
# 1. 验证库存
if not self._check_inventory(order):
return False
# 2. 处理支付
total = order.calculate_total()
if not self.payment_gateway.charge(total):
return False
# 3. 更新库存
self._update_inventory(order)
# 4. 保存订单
self.order_repo.save(order)
return True
# ==================== 3. 接口适配层 ====================
# repositories.py
class OrderRepository(ABC):
@abstractmethod
def save(self, order: Order):
pass
@abstractmethod
def find_by_id(self, order_id: str) -> Optional[Order]:
pass
class SQLAlchemyOrderRepository(OrderRepository):
"""具体实现:使用SQLAlchemy"""
def __init__(self, session):
self.session = session
def save(self, order: Order):
# 将领域对象转换为持久化对象
order_model = OrderModel(
id=order.order_id,
items=[ItemModel(name=item.name) for item in order.items]
)
self.session.add(order_model)
self.session.commit()
# ==================== 4. 表现层 ====================
# controllers.py
class OrderController:
def __init__(self, process_order_use_case: ProcessOrderUseCase):
self.process_order_use_case = process_order_use_case
def create_order(self, request_data: Dict) -> Dict:
"""处理HTTP请求"""
try:
# 1. 从请求创建领域对象
order = self._create_order_from_request(request_data)
# 2. 执行业务用例
success = self.process_order_use_case.execute(order)
# 3. 返回响应
if success:
return {"status": "success", "order_id": order.order_id}
else:
return {"status": "failed", "error": "Order processing failed"}
except Exception as e:
return {"status": "error", "message": str(e)}
总结
软件工程的核心原理构成了一个完整的开发体系:
- 系统工程:强调整体最优,关注系统间的协同和全局优化
- 软件工程:通过标准化过程保证质量和效率
- 架构设计:分离关注点,管理复杂性
- 模式设计:复用已验证的解决方案
- 建模设计:通过抽象简化复杂系统
- UML设计:可视化表达设计思想
- 代码实现:精确执行设计决策
这些原理相互关联,共同指导软件开发的全过程。实际应用中,需要根据项目特点灵活组合和调整这些原理的应用方式。
2092

被折叠的 条评论
为什么被折叠?



