Это плохая идея - раскрывать иерархию наследования в структуре пространства имен?
-
09-06-2019 - |
Вопрос
У меня есть группа взаимосвязанных классов, которые все переопределяются вместе для создания конкретной реализации.Мне интересно, хорошая ли идея заключать взаимосвязанные подклассы в пространство имен.
В качестве примера рассмотрим следующие пространства имен и классы:
namespace Protocol
{
public abstract class Message { }
public abstract class Driver { }
}
namespace Protocol.Tcp
{
public class TcpMessage : Message { }
public class TcpDriver : Driver { }
}
namespace Protocol.Ftp
{
public class FtpMessage : Message { }
public class FtpDriver : Driver { }
}
Каков наилучший способ структурирования пространств имен?Кажется неизбежным раскрывать наследование в пространстве имен, поскольку базовые классы на самом деле не принадлежат ни к протоколу.Пространство имен Tcp, ни к протоколу.Пространство имен Ftp.
Решение
Я думаю, что вы, возможно, слишком сильно беспокоитесь!
Имеет ли это логический смысл?Знаете ли вы, где найти ваш код в пространствах имен?
Я бы предпочел видеть кодовую базу, подобную приведенной выше, с небольшим количеством классов, соответствующих имени с иерархией, чем одно большое пространство имен, где все взаимосвязано..
Помните, что пространство имен существует именно для этого, чтобы логически организуйте свою кодовую базу
То, что у вас есть, кажется логичным :)
Редактировать:
В качестве примера:
using System.Data;
using System.Data.Sql;
;)
Другие советы
Исходные теги показывают, что этот пост посвящен C #, поэтому множественное наследование неуместно - вы не можете умножать inherit в C #.
Возможно, вам следует рассмотреть возможность определения некоторых интерфейсов, которые определяют, каковы основные контракты Message
и еще Driver
являются, и тогда вы можете чувствовать себя немного свободнее, используя структуру пространства имен для имитации технологических различий.
Если бы это был я, я бы определил 2 пространства имен:
Protocol
и
Protocol.Driver
Подобное разделение пространства имен отделяет ваш "библиотечный код" от вашего "исполняемого / тестового кода". Я также создаю свои пространства имен в соответствии со структурой каталогов;это придаст логики структуре ваших программ и кодовым файлам.(может быть, вы уже делаете это ...)