Преобразование комиксов


У меня двое маленьких структур (может измениться позже классы), которые загружаются в общих списках. Загрузка списков является то, что я прошу об. Это может быть сделано лучше или более объектно-ориентированным?

Вы будете заметьте, что я использую библиотеки MS Enterprise для доступа к базе данных файл sqlce.

Я просто ищу некоторые мнения на этот код. Существует ли более эффективный способ сделать то, что я написал до сих пор? Моя цель-сделать код максимально эффективным и при этом еще быть ремонтопригодны и расширяемой.

 public class ConversionUtility
{

    private List<ComicBook> _books;
    private List<ComicPublisher> _publishers;

    private void Load()
    {
        try
        {
            _books = GetBooks();
            _publishers = GetPublishers();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    public void PerformConversion()
    {
        Load();

       //still working on this

    }


    private List<ComicPublisher> GetPublishers()
    {
        List<ComicPublisher> tmp = new List<ComicPublisher>();

        Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>("CeConnectionString");

        IDataReader rdr = db.ExecuteReader(CommandType.Text, "SELECT * FROM Publisher");

        while (rdr.Read())
        {
            tmp.Add(new ComicPublisher { Id = (int)rdr["PublisherId"], Name = rdr["PublisherName"].ToString() });
        }
        return tmp;

    }

    private List<ComicBook> GetBooks()
    {
        List<ComicBook> tmp = new List<ComicBook>();

        Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>("CeConnectionString");

        IDataReader rdr = db.ExecuteReader(CommandType.Text, "SELECT * FROM Book");

        while (rdr.Read())
        {
            tmp.Add(new ComicBook { Id = (int)rdr["BookId"], Title = rdr["Title"].ToString(), Company = rdr["Company"].ToString() });
        }

        return tmp;

    }

}


public struct ComicPublisher
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public struct ComicBook
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Company { get; set; }
}


572
4
задан 24 ноября 2011 в 11:11 Источник Поделиться
Комментарии
3 ответа

Во-первых:

Закройте ваши DataReaders!!!

Во-вторых:

Вы можете хотеть рассматривать реферирование шаблонный код такой:

  Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>("CeConnectionString");
IDataReader rdr = db.ExecuteReader(CommandType.Text, "SELECT * FROM Book");

В некоторые вспомогательные методы.

4
ответ дан 24 ноября 2011 в 11:11 Источник Поделиться

Я предпочитаю структураs, чтобы быть неизменным и использовать интерфейс , в случае когда доступно, так что у меня есть (включая мой комментарий на вопрос) представить:

public sealed class ConversionUtility
{
private IList<ComicBook> _books;
private IList<ComicPublisher> _publishers;

public void PerformConversion()
{
this.Load();

// still working on this
}

private void Load()
{
try
{
this._books = this.GetBooks();
this._publishers = this.GetPublishers();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}

private IList<ComicPublisher> GetPublishers()
{
IList<ComicPublisher> tmp = new List<ComicPublisher>();

Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>("CeConnectionString");

using (IDataReader rdr = db.ExecuteReader(CommandType.Text, "SELECT * FROM Publisher"))
{
while (rdr.Read())
{
tmp.Add(new ComicPublisher((int)rdr["PublisherId"], rdr["PublisherName"].ToString()));
}
}

return tmp;
}

private IList<ComicBook> GetBooks()
{
IList<ComicBook> tmp = new List<ComicBook>();

Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>("CeConnectionString");

using (IDataReader rdr = db.ExecuteReader(CommandType.Text, "SELECT * FROM Book"))
{
while (rdr.Read())
{
tmp.Add(new ComicBook((int)rdr["BookId"], rdr["Title"].ToString(), rdr["Company"].ToString()));
}
}

return tmp;
}
}

public struct ComicPublisher
{
private readonly int id;
private readonly string name;

public ComicPublisher(int id, string name)
{
this.id = id;
this.name = name;
}

public int Id { get { return this.id; } }
public string Name { get { return this.name; } }
}

public struct ComicBook
{
private readonly int id;
private readonly string title;
private readonly string company;

public ComicBook(int id, string title, string company)
{
this.id = id;
this.title = title;
this.company = company;
}

public int Id { get { return this.id; } }
public string Title { get { return this.title; } }
public string Company { get { return this.company; } }
}

2
ответ дан 25 ноября 2011 в 03:11 Источник Поделиться

Вы могли бы сделать это в универсальный метод. Если вы хотите изменить свои таблицы и классы в согласованном формате, то это было бы очень просто:

interface IThing
{
int Id {get;set;}
string Name {get;set;}
string DatabaseTableName {get;}
}

class GetThings<T> where T : IThing, new()
{
private List<T> GetItems()
{
var t = new T();

List<T> tmp = new List<T>();
Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>("CeConnectionString");
string query = String.Format("SELECT * FROM {0}", t.DatabaseTableName);
IDataReader rdr = db.ExecuteReader(CommandType.Text, query);

while (rdr.Read())
{
tmp.Add(new T { Id = (int)rdr["Id"], Name = rdr["Name"].ToString() });
}
return tmp;
}
}

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

Сказав это, я не считаю, что это стоит писать универсальные классы для обработки двух структур.

0
ответ дан 25 ноября 2011 в 01:11 Источник Поделиться