C # - Отдельный интерфейс от бизнес-кода - PullRequest
4 голосов
/ 27 февраля 2011

Я хочу знать, что лучше всего подходит для следующего случая:

Я разрабатываю приложение, которое необходимо использовать на трех разных размерах экрана: 240x320; 800х600; 1280x1024 (и только эти три) на разных языках (с использованием локализации).

Итак, я создал библиотеку по размеру экрана, каждый из которых реализует интерфейс, определенный в проекте, который вызывает эти экраны.

Первый вопрос: все мои файлы ресурсов дублируются, и это много файлов, которые необходимо обновлять (или с дублирующими метками). Есть ли простой способ изменить это?

Второй вопрос: я использую хороший подход или существует лучший способ сделать то, что я пытаюсь сделать? Может быть, применяя шаблон дизайна?


Пример кода

Код звонящего:

    public int X { get { return 800; } }
    public int Y { get { return 600; } }

    public interface IScreenForm
    {
        Form FormComponent { get; }
    }

    public interface IFormA : IScreenForm
    {
        TextBox UserTextBox { get; } // For use
    }

    public void LoadForm<T>()
        where T:IScreenForm
    {
        if (!typeof(T).IsInterface)
        {
            throw new ArgumentException(typeof(T).Name + " is not an interface");
        }

        Assembly screenAssembly;
        string screenResolutionDll = string.Format("{0}_{1}_screens.dll", this.X, this.Y);

        screenAssembly = Assembly.LoadFrom(screenResolutionDll);

        Type formType = screenAssembly.GetTypes()
            .FirstOrDefault(t => t.GetInterfaces().Where(i => i.Name == typeof(T).Name).Count() > 0);

        if (formType != null)
        {
            Form form = (Form)formType.GetConstructor(new Type[] { }).Invoke(null);
            if (form != null)
            {
                form.Show();
            }
            else 
            {
                throw new ArgumentException("Form doesn't provide a new() ctor");
            }
        }
        else
        {
            throw new ArgumentException("Any form doesn't implement the interface : " + typeof(T).Name);
        }
    }

DLL экрана:

public partial class MyFirstForm : Form, caller.IFormA
{
    public Form1()
    {
        InitializeComponent();
    }

    /* caller.IFormA interface implementation */
}

Ответы [ 2 ]

3 голосов
/ 27 февраля 2011

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

Что касается размеров экрана, я бы не стал слишком умным.Да, убедитесь, что ни одна из ваших бизнес / не-GUI логики не дублируется, кроме дублирования файлов ресурсов, форм и т. Д. - я бы не беспокоился об этом.Некоторые GUI-фреймворки, такие как Qt и GTK, автоматически меняют размеры и автоматически позиционируют GUI-виджеты (например, Qt имеет виджеты 'spacer').Большую часть времени он работает нормально, однако я все же предпочитаю явный контроль.При программировании с использованием графического интерфейса часто возникают непредвиденные затруднения, поскольку наличие трех независимых наборов компонентов графического интерфейса позволит вам устранить их, если они возникнут.Некоторые примеры источников проблем: 1) Размер шрифта.2) Настройки доступности Windows.3) У некоторых национальных языков среднее количество слов длиннее, чем у других, у длинных слов проблемы с размещением в доступной недвижимости.

Если бы я был на вашем месте, я бы посмотрел, например, как браузеры справляются с этим (например, мобильные инастольную версию), и я постараюсь найти некоторые практические советы в Интернете (как здесь, в SO).Я сомневаюсь, что книги по шаблонам дизайна очень помогут в этом.Отказ от ответственности: я скептик дизайна шаблона.

1 голос
/ 27 февраля 2011

Трудно дать совет, не получив полную картину, но некоторые советы, которые могут быть вам полезны, прочитайте

http://msdn.microsoft.com/en-us/library/ff648753.aspx

о фабрике программного обеспечения SmartClient.

Он поставляется с руководством по архитектуре и решениями проблем, которые вы часто видите в приложениях такого типа

...