AlexNet
击败了之前最火的传统的核方法Kernel (良好的泛函的数学定义,计算模型复杂度,可以计算模型的效果)
https://www.bilibili.com/video/BV1h54y1L7oe/
好的,一个交易所项目通常会涉及多个模块和类来处理不同的功能。以下是一个典型的交易所项目可能包含的类和它们的作用:
项目结构
exchange/
│
├── main.go
├── config/
│ └── config.go
├── models/
│ ├── user.go
│ ├── order.go
│ ├── trade.go
│ └── asset.go
├── services/
│ ├── user_service.go
│ ├── order_service.go
│ ├── trade_service.go
│ └── asset_service.go
├── controllers/
│ ├── user_controller.go
│ ├── order_controller.go
│ ├── trade_controller.go
│ └── asset_controller.go
├── repositories/
│ ├── user_repository.go
│ ├── order_repository.go
│ ├── trade_repository.go
│ └── asset_repository.go
└── utils/
├── logger.go
└── utils.go
各个类及其作用
config/config.go
- Config:管理项目的配置参数,如数据库连接信息、API 密钥等。
models/user.go
- User:表示用户的基本信息,如用户名、密码、邮箱等。
models/order.go
- Order:表示交易订单的相关信息,如订单类型(买/卖)、数量、价格、状态等。
models/trade.go
- Trade:表示已成交的交易信息,包括买方、卖方、交易数量、交易价格等。
models/asset.go
- Asset:表示用户的资产信息,如账户余额、持有的各种加密货币等。
services/user_service.go
- UserService:处理与用户相关的业务逻辑,如用户注册、登录、账户管理等。
services/order_service.go
- OrderService:处理与订单相关的业务逻辑,如下单、取消订单、查询订单状态等。
services/trade_service.go
- TradeService:处理与交易相关的业务逻辑,如撮合交易、生成交易记录等。
services/asset_service.go
- AssetService:处理与资产相关的业务逻辑,如查询账户余额、充值提现等。
controllers/user_controller.go
- UserController:处理用户相关的 HTTP 请求,如注册、登录、获取用户信息等。
controllers/order_controller.go
- OrderController:处理订单相关的 HTTP 请求,如创建订单、取消订单、获取订单信息等。
controllers/trade_controller.go
- TradeController:处理交易相关的 HTTP 请求,如获取交易记录等。
controllers/asset_controller.go
- AssetController:处理资产相关的 HTTP 请求,如查询账户余额、充值提现等。
repositories/user_repository.go
- UserRepository:负责与数据库交互,执行与用户相关的数据操作,如插入、查询、更新用户信息等。
repositories/order_repository.go
- OrderRepository:负责与数据库交互,执行与订单相关的数据操作,如插入、查询、更新订单信息等。
repositories/trade_repository.go
- TradeRepository:负责与数据库交互,执行与交易相关的数据操作,如插入、查询交易记录等。
repositories/asset_repository.go
- AssetRepository:负责与数据库交互,执行与资产相关的数据操作,如插入、查询、更新资产信息等。
utils/logger.go
- Logger:提供日志记录功能,用于记录系统运行时的各种日志信息。
utils/utils.go
- Utils:提供各种通用的辅助函数,如字符串处理、时间格式转换等。
示例代码
models/order.go
package models
import "time"
// Order represents a trading order in the exchange.
type Order struct {
ID string
UserID string
Type string // "buy" or "sell"
Quantity float64
Price float64
Status string // "open", "completed", "cancelled"
CreatedAt time.Time
UpdatedAt time.Time
}
services/order_service.go
package services
import (
"exchange/models"
"exchange/repositories"
"time"
)
// OrderService handles business logic related to orders.
type OrderService struct {
orderRepo repositories.OrderRepository
}
// NewOrderService creates a new OrderService.
func NewOrderService(orderRepo repositories.OrderRepository) *OrderService {
return &OrderService{orderRepo: orderRepo}
}
// CreateOrder creates a new order.
func (s *OrderService) CreateOrder(userID, orderType string, quantity, price float64) (*models.Order, error) {
order := &models.Order{
ID: generateOrderID(),
UserID: userID,
Type: orderType,
Quantity: quantity,
Price: price,
Status: "open",
CreatedAt: time.Now(),
}
err := s.orderRepo.Save(order)
if err != nil {
return nil, err
}
return order, nil
}
// Additional methods for order service, such as CancelOrder, GetOrder, etc.
总结
在这个交易所项目中,每个模块和类都有明确的职责:
- 模型层(models):定义数据结构。
- 服务层(services):处理业务逻辑。
- 控制器层(controllers):处理 HTTP 请求。
- 仓储层(repositories):处理数据持久化。
- 工具层(utils):提供辅助功能。
这种分层结构有助于保持代码的清晰性和可维护性,每个类和模块都有明确的责任和功能。
面向对象编程(Object-Oriented Programming,简称 OOP)是一种编程范式,它使用“对象”这一概念来封装数据和操作数据的方法。对象通常是类的实例,类定义了对象的属性(数据成员)和方法(成员函数)。
在面向对象编程中,setter
和 getter
是用于访问和修改对象属性的方法。
- Getter:用于获取对象的属性值。例如,如果一个类有一个私有属性
name
,那么getter
方法可以是getName()
,用于返回name
的值。 - Setter:用于设置对象的属性值。例如,如果一个类有一个私有属性
name
,那么setter
方法可以是setName(String name)
,用于设置name
的值。
这些方法的主要目的是实现对对象属性的封装和保护,防止外部代码直接访问或修改对象的私有属性。
是否必须使用 Setter 和 Getter
在面向对象编程中,使用 setter
和 getter
并不是强制的,但它们是良好编程习惯的一部分,尤其是在需要对属性进行额外的验证或处理时。例如:
public class Person {
private String name;
private int age;
// Getter for name
public String getName() {
return name;
}
// Setter for name
public void setName(String name) {
this.name = name;
}
// Getter for age
public int getAge() {
return age;
}
// Setter for age
public void setAge(int age) {
if (age > 0) { // 进行一些验证
this.age = age;
}
}
}
访问和操作别的类内部成员
尽管 setter
和 getter
是推荐的方式,但并不是唯一的方法。你可以直接访问类的公共成员变量(如果存在),但这通常不被推荐,因为这样做会破坏封装性,增加代码的耦合度,降低代码的可维护性和安全性。
this
指针
this
指针是一个引用,指向调用对象自身。在 Java 中,this
关键字用于引用当前对象的实例。它可以在类的方法中使用,以区分成员变量和方法参数,或者在构造函数中调用另一个构造函数。例如:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name; // 使用 this 关键字区分成员变量和参数
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
在这个例子中,this.name
和 this.age
用于区分成员变量和方法参数,确保它们被正确赋值。
总结
- 面向对象编程强调使用对象和类来封装数据和行为。
setter
和getter
方法用于访问和修改私有属性,增强封装性和数据保护。this
关键字用于引用当前对象实例,通常用于区分成员变量和方法参数。