Tôi hiểu rằng trong lập trình chung, các thuật toán được tách ra khỏi các vùng chứa. Vì vậy, sẽ không có ý nghĩa gì khi thực hiện một thuật toán chung như một phương thức thể hiện (cùng một thuật toán sẽ làm việc trên nhiều lớp cụ thể; chúng ta không muốn làm cho chúng kế thừa từ một ABC vì nó sẽ tăng số lượng các lớp).Tại sao Thư viện đồ thị Boost (nguồn) là một hàm toàn cục?
Nhưng trong trường hợp của source()
chức năng trong Boost Graph Library, tôi không hiểu lý do tại sao nó là một chức năng toàn cầu và không phải là một phương pháp thể hiện của một lớp biểu đồ.
Theo như tôi có thể biết bằng cách đọc số BGL source code, source(e, g)
cần biết chi tiết triển khai của biểu đồ và cạnh đối tượng được truyền cho nó; không đủ để chỉ biết các giao diện của chúng.
Vì vậy, source()
không phải là một thuật toán chung. Nói cách khác, nó cần biết lớp bê tông của thể hiện đồ thị. Sau đó, tại sao không đặt nó trong cùng một lớp như một phương pháp dụ? Nó sẽ không sạch hơn/ít khó hiểu hơn là tạo ra một chức năng toàn cầu cần phải được tùy chỉnh cho mỗi lớp mà nó được gọi?
CẬP NHẬT
Mã nguồn liên quan:
// dwa 09/25/00 - needed to be more explicit so reverse_graph would work.
template <class Directed, class Vertex,
class OutEdgeListS,
class VertexListS,
class DirectedS,
class VertexProperty,
class EdgeProperty,
class GraphProperty, class EdgeListS>
inline Vertex
source(const detail::edge_base<Directed,Vertex>& e,
const adjacency_list<OutEdgeListS, VertexListS, DirectedS,
VertexProperty, EdgeProperty, GraphProperty, EdgeListS>&)
{
return e.m_source;
}
namespace boost {
namespace detail {
template <typename Directed, typename Vertex>
struct edge_base
{
inline edge_base() {}
inline edge_base(Vertex s, Vertex d)
: m_source(s), m_target(d) { }
Vertex m_source;
Vertex m_target;
};
}
}
Không có nguồn lý do nào (a, b) không thể chuyên biệt dựa trên các loại tham số của nó. Không phải mọi thứ đều phải là một hàm thành viên. Một số chức năng miễn phí có thể được coi là một phần của giao diện của một lớp. Ngoài ra nó có thể hữu ích để có thể sử dụng source() như một shim. Nếu không đọc và hiểu mã (không thể truy cập trong vòng 2 lần nhấp vào liên kết của bạn), tôi không thể nói với bạn rằng vì tôi không sử dụng thư viện biểu đồ nhưng chúng có thể là những thứ cần xem xét. Ngoài ra, hãy gửi thư trực tiếp cho nhà phát triển BGL và hỏi về quyết định thiết kế của họ. Tôi hy vọng có một lý do chính đáng cho nó – Pete
Có lý do nào khiến bạn phiền lòng không? – Pete
http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197 –