Единственное наследование таблицы и где использовать его в направляющих

Оба

Если клиентский сокет (который связан с NetworkStream) закрыт до того, как вы позвоните Read, он выбрасывает исключение ввода-вывода.

Если сокет сервера закрыт во время (или до этого) Read, он может вернуть 0, что означает, что сервер ничего не отправил.

Некоторые примеры:

var server = new Socket(SocketType.Stream, ProtocolType.Tcp);
var client = new Socket(SocketType.Stream, ProtocolType.Tcp);

/* Init the server socket */
server.Bind(new IPEndPoint(IPAddress.Any, 19998));
server.Listen(50);
server.BeginAccept(ar =>
{
    var server2 = server.EndAccept(ar);
    //server2.Close(); // Read will return 0
},
null);

/* Init the client socket */
client.Connect(IPAddress.Loopback, 19998);
NetworkStream stream = new NetworkStream(client);
//client.Close(); // Read will throw IOException
var buf = new byte[128];
int read = stream.Read(buf, 0, 128);
53
задан Brian Tompsett - 汤莱恩 16 September 2016 в 09:04
поделиться

4 ответа

Характеристика STI как главным образом полезный, когда атрибуты являются тем же, но поведение отличается, "о праве", но возможно небольшом ограничении. Мне нравится использовать STI, когда существует, как имя предполагает, ясные отношения наследования стиля OO, а не отношения стиля базы данных между объектами различных типов.

, Если бы существует общий код между ботами и пользователями, я сказал бы, что STI походит на победителя. Если существуют только некоторые общие атрибуты, этого, вероятно, менее применимо, но все еще стоит делать попытку.

я - довольно экспериментальный человек, таким образом, моя рекомендация состоит в том, чтобы дать ему движение. Ответвление Ваш код и осуществляет рефакторинг модели в отношения STI. Посмотрите, высушило ли это действительно вещи или просто подкачивает один набор головных болей для некоторой другой проблемы.

Одна вещь я думаю, что Вы не будете видеть, что много преимущества от высушило Ваши контроллеры. По моему опыту, модели STI не часто переводят в столь же связанные контроллеры. Но это было бы чем-то еще для экспериментирования с. Иногда существует победа, иногда нет.

35
ответ дан womble 7 November 2019 в 08:48
поделиться

Я, вероятно, использовал бы или STI или никакие специальные функции вообще. Вы смогли называть все Профилем, и Вы будете знать, был ли это "бот", если его пользователь был нолем. Вы могли также сохранить поле "типа", не используя STI.

вещи Certain влияли бы на мое решение использовать STI:

  • , Существует ли определенная для бота логика
  • , Сколько боты там по сравнению с пользовательскими профилями (небольшое количество ботов означает, STI в порядке - много ботов, и я мог бы сохранить их где-то в другом месте)

причина избежать, чтобы STI иногда был, это может стоять на пути. Например, это может быть довольно раздражающим для изменения объекта от одного типа до другого (Бот к Профилю в этом случае). Иногда простое поле "типа" лучше.

, который стоит отметить, что Вы, вероятно, захотите общий базовый класс при использовании STI. Таким образом, можно хотеть Profile, BotProfile, и UserProfile. Имена ваше дело. :)

5
ответ дан wuputah 7 November 2019 в 08:48
поделиться

Один глюк направляющих STI - большинство плагинов (и т.д) не поддерживает его полностью. Вы исправите многие общие.

4
ответ дан Sarah Mei 7 November 2019 в 08:48
поделиться

Я написал статью по этой теме, в том числе несколько советов по работе с STI:

Single Table Inheritance in Rails

Вкратце: должен быть четкий объектно ориентированный объект отношения наследования стиля между объектами (как красноречиво заявил womble), а не только некоторые общие данные. Если нет естественной и очевидной иерархии классов, проект STI может стать трудным в поддержке по мере развития вашего приложения.

Во-вторых, вы должны подумать, важно ли иметь все данные в одной таблице. С полиморфными ассоциациями ваши запросы к базе данных станут более сложными и, возможно, медленнее. Если вы планируете перечислить все объекты вместе на сайте (например, в таблице), то STI может быть вашим решением.

В-третьих, убедитесь, что у ваших дочерних классов не слишком много уникальных атрибутов. Со всеми данными в одной таблице вам не нужно много неглобальных столбцов. Они не только занимают место (что не является серьезной проблемой), но и усложняют структуру данных. Если у вас есть «особые» столбцы, вы должны явно объяснить их в своем коде.

Наконец, если вы все-таки используете STI, я настоятельно рекомендую использовать один контроллер для всех ваших дочерних моделей. Основная функция контроллера - предоставить доступ к объектам, и если к объектам нужно получить доступ совершенно разными способами, то STI, возможно, был неправильным выбором дизайна для начала.

Ознакомьтесь с моей статьей (ссылка выше ), чтобы получить еще несколько полезных советов.

столбцы, вы должны явно объяснять их в своем коде.

Наконец, если вы действительно используете STI, я настоятельно рекомендую использовать один контроллер для всех ваших дочерних моделей. Основная функция контроллера - предоставить доступ к объектам, и если к объектам нужно получить доступ совершенно разными способами, то STI, возможно, был неправильным выбором дизайна для начала.

Ознакомьтесь с моей статьей (ссылка выше ), чтобы получить еще несколько полезных советов.

столбцы, вы должны явно объяснить их в своем коде.

Наконец, если вы действительно используете STI, я настоятельно рекомендую использовать один контроллер для всех ваших дочерних моделей. Основная функция контроллера - предоставить доступ к объектам, и если к объектам нужно обращаться разными способами, то STI, возможно, не был правильным выбором дизайна для начала.

Ознакомьтесь с моей статьей (ссылка выше ), чтобы получить еще несколько полезных советов.

29
ответ дан 7 November 2019 в 08:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: