Я пытаюсь создать класс, который будет инициализировать его себя, либо передав ссылку на запись в базе данных (с намерением, что запрос будет запущен в отношении базы данных, а возвращаемые значения для свойств объектов будут в нем) или путем указания значений «вручную» - это не требует вызова базы данных.Конструкторы цепной перегрузки?
Я рассмотрел пару учебников, чтобы открыть «Лучшую практику» для этой функциональности, и, к сожалению, я пришел в себя.
Я написал несколько примеров консольных приложений, отражающих то, что я считаю двумя наиболее вероятными решениями, но у меня нет идеи, которая лучше всего подходит для правильной реализации?
Образец приложения № 1 использует то, что говорит большинство книг, это «предпочтительный» способ, но большинство примеров, приведенных рядом с этими утверждениями, действительно не соответствуют контексту моей ситуации. Я беспокоюсь о том, что поток не так читается, как приложение №2.
using System;
namespace TestApp
{
public class Program
{
public static void Main(string[] args)
{
var one = new OverloadedClassTester();
var two = new OverloadedClassTester(42);
var three = new OverloadedClassTester(69, "Mike", 24);
Console.WriteLine("{0}{1}{2}", one, two, three);
Console.ReadKey();
}
}
public class OverloadedClassTester
{
public int ID { get; set; }
public string Name { get; set; }
public int age { get; set; }
public OverloadedClassTester() : this(0) { }
public OverloadedClassTester (int _ID) : this (_ID, "", 0)
{
this.age = 14; // Pretend that this was sourced from a database
this.Name = "Steve"; // Pretend that this was sourced from a database
}
public OverloadedClassTester(int _ID, string _Name, int _age)
{
this.ID = _ID;
this.Name = _Name;
this.age = _age;
}
public override string ToString()
{
return String.Format("ID: {0}\nName: {1}\nAge: {2}\n\n", this.ID, this.Name, this.age);
}
}
}
Этот образец (приложение № 2) «появляется» более читабельным - в том, что я думаю, что это легче увидеть поток работы. Однако он действительно эффективен с точки зрения сохраненных символов: p. Кроме того, разве не опасно, что он вызывает метод объекта до его полной инициализации или это не проблема?
using System;
namespace TestApp
{
public class Program
{
public static void Main(string[] args)
{
var one = new OverloadedClassTester();
var two = new OverloadedClassTester(42);
var three = new OverloadedClassTester(69, "Mike", 24);
Console.WriteLine("{0}{1}{2}", one, two, three);
Console.ReadKey();
}
}
public class OverloadedClassTester
{
public int ID { get; set; }
public string Name { get; set; }
public int age { get; set; }
public OverloadedClassTester()
{
initialise(0, "", 21); // use defaults.
}
public OverloadedClassTester (int _ID)
{
var age = 14; // Pretend that this was sourced from a database (from _ID)
var Name = "Steve"; // Pretend that this was sourced from a database (from _ID)
initialise(_ID, Name, age);
}
public OverloadedClassTester(int _ID, string _Name, int _age)
{
initialise(_ID, _Name, _age);
}
public void initialise(int _ID, string _Name, int _age)
{
this.ID = _ID;
this.Name = _Name;
this.age = _age;
}
public override string ToString()
{
return String.Format("ID: {0}\nName: {1}\nAge: {2}\n\n", this.ID, this.Name, this.age);
}
}
}
Что такое «правильный» способ решить эту проблему и почему?
Спасибо,
«Притворись, что это было из базы данных» - этот комментарий немного сбивает с толку. Означает ли это, что вы будете обращаться к базе данных только в конструкторе * that * и в противном случае использовать параметры? Я считаю это очень запутанным. – Groo