Rozumiem, że w programowaniu ogólnym algorytmy są oddzielane od kontenerów. Więc nie ma sensu implementować ogólnego algorytmu jako metody instancji (ten sam algorytm powinien działać na wielu konkretnych klasach, nie chcemy, aby wszystkie dziedziczyły z jednego ABC, ponieważ spowodowałby wykładniczy wzrost liczby klas).Dlaczego funkcja Boost Graph Library `source()` jest funkcją globalną?
Ale w przypadku funkcji source()
w Boost Graph Library, nie rozumiem, dlaczego jest to funkcja globalna, a nie metoda instancji klasy wykresu.
O ile mogę powiedzieć, czytając BGL source code, source(e, g)
musi znać szczegóły implementacji wykresu i krawędzi obiektów przekazanych do niej; nie wystarczy znać tylko ich interfejsów.
Tak więc source()
nie jest ogólnym algorytmem. Innymi słowy, musi znać konkretną klasę instancji wykresu. Dlaczego więc nie umieścić go w tej samej klasie, co metoda instancji? Czy nie byłoby to o wiele czystsze/mniej dezorientujące niż tworzenie globalnej funkcji, która musi być dostosowywana do każdej klasy, do której jest przywoływana?
UPDATE
Odpowiedni kod źródłowy:
// 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;
};
}
}
Nie ma powodu, dla którego źródło (a, b) nie może być wyspecjalizowane w oparciu o typy jego parametrów. Nie wszystko musi być funkcją członka. Niektóre bezpłatne funkcje mogą być uważane za część interfejsu klasy. Dodatkowo przydatna może być funkcja source() jako podkładka. Bez czytania i zrozumienia kodu (który nie jest dostępny w ciągu 2 kliknięć linków), nie mogłem ci tego powiedzieć, ponieważ nie korzystam z biblioteki grafów, ale mogą to być rzeczy do rozważenia. Ewentualnie wyślij bezpośrednio programistów BGL i zapytaj o ich decyzję projektową. Spodziewam się, że istnieje ku temu dobry powód – Pete
Czy jest jakiś powód, dla którego ci to przeszkadza? – Pete
http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197 –