Не бойся свободной функции!
Мне кажется подозрительным, что CatalogMapper
отображает Hotel.Address
.Чтобы быть должным образом учтенным / инкапсулированным, либо
CatalogMapper
должно работать на не-специфичных для отеля Address
,
или,если Hotel.Address
является каким-то особым для GeoCodes, то Hotel.Address
должен быть в состоянии сопоставить себя с GeoCode без CatalogMapper
.
С пояснениями в комментариях яЯ хотел бы предложить следующее.Я не знаю C #, поэтому я напишу это как C ++.Я надеюсь, что это переводит
struct Hotel {
const Address & address () const;
// I typedef EVERTYTHING :-)
typedef std :: list <std :: string> StringList;
typedef std :: pair <Hotel, Hotel> Pair;
typedef std :: list <Hotel> Container; // TODO implicit sharing?
typedef std :: list <Pair> Mapping;
// NB will be implemented in terms of std::istream operations below,
// or whatever the C# equivalent is.
// These could arguably live elsewhere.
static Container load (const std :: string &);
static Mapping load_mapping (const std :: string &);
static void save (const std :: string &, const Container &);
static void save_mapping (const std :: string &, const Mapping &);
// No need for a "Manager" class for this.
static StringList load_chain (const string & file_name);
private:
static Hotel load (std :: istream &);
void save (std :: ostream &) const;
};
// Global namespace, OK because of overloading. If there is some corresponding
// generic library function which merges pair-of-list into list-of-pair
// then we should be specialising/overloading that.
Hotel :: Mapping merge (const Hotel :: Container &, const Hotel :: Container &);
struct GeoCode {
GeoCode (const Address &);
};
Всякий раз, когда я вижу класс, называемый «Менеджер», если это не объект, который создает, владеет и контролирует доступ к другим объектам, то это предупреждение о том, что мы вКоролевство Существительных.Объекты могут управлять собой.У вас должен быть отдельный класс для логики, только если эта логика выходит за рамки одного класса.