Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2017, 14:52   #1
oldsnowman
Участник клуба
 
Аватар для oldsnowman
 
Регистрация: 20.02.2015
Сообщений: 1,226
По умолчанию MVC в С++

Я использую MVC(модель, вид, контроллер) когда делаю проекты на php.
Но я до сих пор не знаю рационально ли использовать такой подход в проектах на С++ (не для web программирования). Повторюсь, не для веб программирования, а для обычных десктоповых приложений. В принципе, кода мы создаем в проекте форму и накидываем на нее элементы(поля, кнопки), то реализуется "Вид" и "Контроллер". Но если я хочу реализовать классический паттерн MVC, то я должен создать форму, что будет видом VmyForm, создать слушатель и контроллер CmyController, и создать Модель класс для работы с данными MmyModel. В классическом варианте MVC Контроллер отвечает за всю логику, реагирует на событие в Виде, так же контроллер берет данные из Модели, обрабатывает и передает в Вид.
Может мне кто-нибудь скинуть сюда простой пример MVC на С++, но только простой простой пример, а то я запутался в умных вещах.
oldsnowman вне форума Ответить с цитированием
Старый 03.03.2017, 14:59   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от oldsnowman Посмотреть сообщение
рационально ли использовать такой подход
ну это ж зависит от того какую проблему вы пытаетесь им решить.

Цитата:
Сообщение от oldsnowman Посмотреть сообщение
простой
Цитата:
Сообщение от oldsnowman Посмотреть сообщение
С++
как эти два слова в одно предложение попали оО

А разве по "c++ mvc" не гуглится куча всего?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.03.2017, 15:05   #3
oldsnowman
Участник клуба
 
Аватар для oldsnowman
 
Регистрация: 20.02.2015
Сообщений: 1,226
По умолчанию

Цитата:
как эти два слова в одно предложение попали оО
Это специально сделано для усиления трагичности ситуации
Цитата:
А разве по "c++ mvc" не гуглится куча всего?
Как ни странно мало что гуглится по С++, в основном по php и по java(web).
Я чего заморачиваюсь по поводу MVC, в php он зарекомендовал себя хорошо, код структурируется, и легче разобраться что к чему.
В С++ тут получается немного другая картина маслом. Вот хочу разобраться, и жду умных советов и мнений.
oldsnowman вне форума Ответить с цитированием
Старый 03.03.2017, 15:40   #4
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Все паттерны работают так же хорошо, как и в др. языках, НО правильно их реализовать в с++ сложнее и требуется энное время на привыкание (камней уйма там... от деструкторов и до "правильных" header-ов, чтоб проект не начал собираться пол дня).

Чуть ближе к теме: вряд ли вы пишите на голом с++ и winapi (да и там mvc точно не простое)... например, запрос "Qt MVC пример" сразу выдал не плохую статью на Хабре.
GreenWizard вне форума Ответить с цитированием
Старый 03.03.2017, 16:41   #5
oldsnowman
Участник клуба
 
Аватар для oldsnowman
 
Регистрация: 20.02.2015
Сообщений: 1,226
По умолчанию

Цитата:
НО правильно их реализовать в с++ сложнее
Сложнее это еще слабо сказано, я почитал по этой теме много статей и на русском и на английском, посмотрел "примеры правильного кода" MVC для С++, и прихожу все таки к выводу, что использование MVC в его классическом виде не принесет красоты и облегчения в написании кода, а местами и усложнит.
oldsnowman вне форума Ответить с цитированием
Старый 03.03.2017, 17:09   #6
oldsnowman
Участник клуба
 
Аватар для oldsnowman
 
Регистрация: 20.02.2015
Сообщений: 1,226
По умолчанию

вот тут есть единственная вменяемая статья https://www.codeproject.com/Articles...troller-Design
Кому лень идти по ссылки пример кода скину сюда, а кто перейдет, то и статью прочтет и картиночки увидит.
корень программы:
Код:
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
// Note: The view should not send to the model but it is often useful
// for the view to receive update event information from the model. 
// However you should not update the model from the view.
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        frmCalcView view = new frmCalcView();
        CalculatorModel model = new CalculatorModel();
        CalcController controller = new CalcController(model, view);
        Application.Run(view);
    }
}
Контроллер
Код:
class CalcController : IController
{
    ICalcModel model;
    ICalcView view;

    public CalcController( ICalcModel model, ICalcView view)
    {
        this.model = model;
        this.view = view;
        this.view.AddListener(this); // Pass controller to view here.
    }

    public void OnClick( int number )
    {
        view.Total = model.SetInput(number).ToString();
    }

    public void OnAdd()
    {
        model.ChangeToAddState(); 
    }
}
Вид
Код:
/// <summary>
/// Windows Form that will host our MVC based functionality.
/// 
/// </summary>
public partial class frmCalcView : Form, ICalcView
{
    IController controller;
    public frmCalcView( )
    {
        InitializeComponent();
    }
    /// <summary>
    /// The view needs to interact with the controller to pass the click events
    /// This could be done with delegates instead.
    /// </summary>
    /// <param name="controller"></param>
    public void AddListener( IController controller )
    {
        this.controller = controller;
    }
    private void lbl_Click(object sender, EventArgs e)
    {
        // Get the text out of the label to determine the letter and pass the
        // click info to the controller to distribute.
        controller.OnClick((Int32.Parse(((Label)sender).Text)));
    }
    private void lblPlus_Click(object sender, EventArgs e)
    {
        controller.OnAdd();
    }

#region ICalcView Members
    public string Total
    {
        get
        {
            return textBox1.Text;
        }
        set
        {
            textBox1.Text = value;
        }
      }
#endregion
}
Модель
Код:
   /// <summary>
    /// Calculator model, The model is independent of the user interface.
    /// It doesn't know if it's being used from a text-based, graphical, or web interface
    /// This particular model holds the state of the application and the current value.
    /// The current value is updated by SetInput
    /// </summary>
    class CalculatorModel : ICalcModel
    {
        public enum States { NoOperation, Add, Subtract };
        States state;
        int currentValue;
        public States State
        {
            set { state = value; }
        }
        public int SetInput ( int number )
        {
            if (state == States.NoOperation)
            {
                currentValue = number;
            }
             else if (state == States.Add)
            {
                currentValue = Add(currentValue , number );
            }
            return currentValue;
        }
        public void ChangeToAddState()
        {
            this.state = States.Add;
        }
        public int Add( int value1, int value2 )
        {
            return value1 + value2;
        }
        public int Subtract(int value1, int value2)
        {
            throw new System.ApplicationException(" Not implemented yet");
        }
}

Последний раз редактировалось Alex11223; 03.03.2017 в 17:13.
oldsnowman вне форума Ответить с цитированием
Старый 03.03.2017, 17:18   #7
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Цитата:
Сообщение от oldsnowman Посмотреть сообщение
Сложнее это еще слабо сказано, я почитал по этой теме много статей и на русском и на английском, посмотрел "примеры правильного кода" MVC для С++, и прихожу все таки к выводу, что использование MVC в его классическом виде не принесет красоты и облегчения в написании кода, а местами и усложнит.
не скажу именно за mvc, я на с++ не имел дело с gui (и специфика, и предрассудки), но я очень жалею, что раньше пришёл к мысли "не принесет красоты и облегчения в написании кода, а местами и усложнит" и отбросил многие паттерны.... да, в с++ сложнее их сделать правильно, тут много нюансов, но итоговая польза тоже выше
GreenWizard вне форума Ответить с цитированием
Старый 03.03.2017, 17:28   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от GreenWizard Посмотреть сообщение
что раньше пришёл к мысли "не принесет красоты и облегчения в написании кода, а местами и усложнит" и отбросил многие паттерны
что-то как-то не о том мысли.
Паттерн это решение какой-то конкретной задачи/проблемы, которое показалось хорошим разным людям.

Соответственно если стоит такая или похожая задача, то вполне возможно, что паттерн подскажет подходящее решение.

А для красоты их пихать не надо
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 03.03.2017 в 17:43.
Alex11223 вне форума Ответить с цитированием
Старый 03.03.2017, 17:47   #9
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
что-то как-то не о том мысли.
Паттерны это решение какой-то конкретной задачи/проблемы, которое показалось хорошим разным людям.

Соответственно если стоит такая или похожая задача, то вполне возможно, что паттерн подскажет подходящее решение.

А для красоты их пихать не надо
Большинство паттернов подразумевает наличие объектов\классов (можно и без них, но с ними "приятнее"), а в С++ не особо получается наклепать десяток классов, в отличие от того же шарпа, где многие нюансы решаются автоматически.
Красота же - это тут не форматирование кода, а его расширяемость и гибкость. Разве это не одна из базовых функций паттернов? Разве не "красота", когда код легко поддаётся изменениям?)
GreenWizard вне форума Ответить с цитированием
Старый 03.03.2017, 17:58   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну это от ситуации зависит, да и расширяемость не всегда нужна.

Проблема в том, что часто люди только узнавшие про паттерны пытаются пихать их куда попало (или думать "о, синглтон, интересный паттерн, куда б его впихнуть в моем проекте?") и получается фигня


Цитата:
Сообщение от GreenWizard Посмотреть сообщение
в С++ не особо получается наклепать десяток классов, в отличие от того же шарпа, где многие нюансы решаются автоматически.
Так это в целом про выразительность языков, не обязательно про паттерны.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
привязка к модели Asp.net Mvc - C# MVC ts-alan ASP.NET 0 28.07.2015 11:37
Автаризация MVC 4 Деник ASP.NET 1 07.04.2014 08:41
Thread и MVC OnlyFart ASP.NET 0 06.05.2011 11:12
MVC AgentSmit PHP 2 11.01.2011 14:51