2016-02-21 2 views
1

У меня есть класс Student, который необходимо сохранить в базе данных. У меня есть методы, которые создают и обновляют эти студенты (CreateStudent, UpdateStudent) и прямо сейчас, структура этого класса студент:Рекомендации по структуре классов

public class Student 
{ 
    public int ID { get; set; } 
    public string FirstName { get; set; } 
} 

Теперь то, что я имею в виду мой CreateStudent принимает объект Student:

public int CreateStudent(Student newStudent); 

Однако, поскольку этот ученик является новым, идентификатор не будет сохраняться (или не должен сохраняться) в базе данных. Но пользователю метода кажется непонятным, что так оно и работает. Например, я использовал CreateStudent, но прошел Student.ID из 6, метод CreateStudent игнорировал бы ID, так как это создает ученика. Тем не менее, я пытаюсь найти что-то более ясное. Теперь я хочу попробовать отделить идентификатор до интерфейса, который будет доступен только в том случае, если в базе данных уже есть Студент. Вроде как это:

public IEntity 
{ 
    int ID { get; set; } 
} 

public interface IUnknownStudent 
{ 
    string FirstName { get; set; } 
} 

public interface IStudent : IUnknownStudent, IEntity 
{ 
} 

Тогда при использовании CreateStudent, я прохожу IUnknownStudent (не ID). Только при получении или обновлении я буду использовать реализацию с идентификатором. Но я не уверен, есть ли у него какие-либо проблемы с момента его первого раза, когда я пытаюсь это сделать, и мне было интересно, могут ли опытные ребята здесь дать некоторые советы.

EDIT:

CreateStudent() находится на отдельном классе, StudentLogic.

+0

Не означает, что имя 'CreateStudent' просто прямо вверх ** подразумевает **, что ученик ** не создан **, и поэтому идентификатор будет получен _ из базы данных_? Нет необходимости в отдельных интерфейсах.В противном случае, я думаю, вам понадобится «IKnownStudent», который больше работает и глупо. – MickyD

+0

мои 2 цента: как мысленный эксперимент, посмотрите, как далеко вы можете просто создать систему со студенческой записью, являющейся не чем иным, как картой ключевого значения пар. выяснить минимальный набор функций (статические методы, которые, как я полагаю), необходимо действовать на этих картах, чтобы удовлетворить цели вашей программы. не предполагайте, что классы (или интерфейсы) не нужны, пока вы не достигнете точки, когда ваш дизайн начнет убеждать вас в противном случае - в этот момент класс или два могут всплыть и сделать действительно убедительный случай для себя – lispHK01

ответ

1

Одна вещь, которую я вижу, что вы, вероятно, хотите отдельный класс для StudentData, в котором у вас есть метод

public int createStudent(Student s){ 
//TODO: Implement method here 
} 

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

public class Student 
{ 
    public string firstName { get; set; } 
    //rest of class 
} 

Когда я иду создать Студент с помощью метода createStudent внутри класса, я бы сказал, что это:

Student s = new Student(); 
s.createStudent(s); 

И на самом деле не так, как мы хотим создавать вещи, верно? Этот код будет трудно читать и понимать, если вы хотите сохранить это обновление.

Я согласен с тем, что вы хотите, чтобы ID был реализован как отдельный класс или интерфейс, в зависимости от того, что вам нужно, и вы можете захотеть иметь значение по умолчанию для «ИД» в случае неизвестного нового студента создается. Таким образом, когда вы возвращаете идентификатор нового ученика, он всегда остается неизменным до тех пор, пока пользователь не вводит новый идентификатор для ученика или не будет автоматически выбран следующий идентификатор. Главное, что я предлагаю, - использовать класс StudentData для размещения метода createStudent и разместить главную функцию, если она у вас есть. Таким образом, вы используете больше стиля MVC (Model-View-Controller) разработки, со студентом и их идентификатором, а модель и вид и контроллер обрабатываются классом StudentData. Это простой способ структурировать вещи, как только вы это понимаете.

+0

Хорошо, извините, ошибка мужа, Обновите вопрос. CreateStudent находится в другом классе, StudentLogic. Поэтому, основываясь на вашем ответе, разделение идентификатора в порядке. Позвольте мне подождать еще несколько ответов, я очень хочу, чтобы я решила, что буду идти вперед. –

+1

Хорошо, я думаю, что идентификация как отдельная вещь будет в порядке, но вы также можете просто сохранить идентификатор конфиденциальным, чтобы ничто другое не могло его изменить. Это может быть более простой маршрут, в зависимости от того, что вы хотите использовать id, и если это только целочисленное значение. Единственное, что вы измените, если вы создадите идентификатор как отдельный объект, будет заключаться в том, что вам придется изменить createStudent из public int createStudent (Student s) в public IEntity createStudent (Student s) – Trey50Daniel

Смежные вопросы