Рейтинг:
19
HobbyProggy
Поскольку это должно быть решение, я могу попытаться дать вам его, но я должен сказать, что ваша проблема довольно огромна, поэтому правильное решение было бы невозможно дать.
Прежде всего, я восхищаюсь вашей волей улучшить что-то такое сложное ( я сам знаю эту игру), но, как уже говорили другие, я должен сказать, что это большое усилие и большая проблема, так как над этой игрой работали несколько (если не даже сотни) разработчиков в своей конкретной области.
Что касается структурной части, я предлагаю вам прочитать «Шаблоны проектирования» и подумать о том, какой может быть возможная структура, как вы начали с объекта «Карты». В основном я предлагаю вам иметь разделения, такие как объекты (фактически, Datahold), которые подключены через контроллеры (классы, которые выполняют работу) к пользовательскому интерфейсу, который должен быть более глупым, чем интеллектуальным. Это известно как MVC (если вы еще не знаете). В качестве общей структуры подумайте об основных частях, таких как конфигурация и прочее, другой пример - обработка исключений. Вам может понадобиться «движок», который запускает все, включая запуск и обновление пользовательского интерфейса, обработку событий. Между тем вам также нужна графика, которая с одной стороны является объектами, а с другой - "Контроллер" или "Фабрика", как бы вы это ни называли.
Вам также могут понадобиться" бизнес-классы", они предназначены для любого кода, который работает помимо обновления пользовательского интерфейса, например вычисления значений карт, атак или чего-то еще.
Он огромен, и ваша архитектура должна адаптироваться к нему, поэтому вам сначала нужно определить, что вам нужно и как вы можете его отделить. Имеет смысл отделить как можно больше и наследовать там, где вам это может понадобиться (например, карты). У вас может быть базовая карта, которая действительно имеет общую необходимую специфику, а затем сокращенно от нее получить карты атаки (Мостеры) и карты защиты (ловушки или что-то подобное) (Если вы хотите, чтобы это было так, так что просто пример).
Я предлагаю вам начать с чего-то маленького, и как только вы поняли, как отделить и построить маленькое, вы можете масштабировать больше, возможно, вы уже можете использовать свой материал и просто улучшить его, чтобы добраться до следующей цели. Хорошо сделанная архитектура может помочь развиваться все больше и больше, так как основы могут быть одинаковыми, и вы можете использовать ее для других проектов. У меня для себя есть, например, один базовый проект, который компилируется в a .dll, которая содержит доступ к базе данных, конфигурационные материалы, обработку исключений и тому подобное.
Я надеюсь, что смогу немного пробудить ваши мысли и что это может вам помочь. Во всяком случае хорошо как с вашим проектом :)
HobbyProggy
Кстати, нет никакого "правильного способа" или "лучшего способа" справиться с этим. Это очень специфично, и поэтому вы должны решать это каждый раз. Рецепт вроде Сделай это таким образом, и ты преуспел, АФАИК, не существует.
_Q12_
Да, именно на такой разговор я и рассчитывал. Спасибо за добрые мысли. Значит, все-таки это огромная проблема не только для меня, но и для других? Я думал, что я недостаточно хорош, хех. Хорошо.
-
Мне очень любопытно ваше .dll и" бизнес-классы " - можете ли вы привести их более наглядные примеры для меня? Когда вы его используете, в каких ситуациях и где? Если у вас есть удовольствие, конечно - думайте об этой дискуссии как о хорошей возможности немного похвастаться чем-то, что у вас есть хорошего. Я думаю, как вы только что сказали - я предполагаю, что это должно быть что - то базовое, как ядро, очень тонкий скелет, который представляет идею для всей игры или ее направления, и вдобавок ко всему, одетый множеством объектов извне-даже из файлов, из dll ,из разных классов, одного и того же кода, чего угодно.
-
В частности, в этом проекте карточной игры все, о чем я мог думать и работать должным образом, - это объект карты, и, как вы сказали, это базовый объект для любого типа карты, которую я буду создавать с этого момента, с любым количеством способностей. в теме. НО (я использую большое НО), этот объект карты является объектом, находящимся за пределами ЯДРА. Эта карта будет прикреплена к ЯДлю. Само ядро, я еще не понял его, я вернусь к его достижению, исходя из того, что я могу наблюдать - и под этим я имею в виду, что я, вероятно, сначала построю объекты, и все они (надеюсь) дадут мне подсказки об этом ЯДРЕ, о котором я мечтаю. Я не уверен, что это ЯДРО вообще существует !! может быть, в моем воображении. Это основная причина, по которой я пришел спросить вас, ребята. Итак ... какие-нибудь хорошие предложения, которые помогут мне понять эту вещь (если это так)?
-
Самое сложное, что я могу придумать, - это как сделать это ядро таким образом, чтобы я мог добавить к нему любое количество объектов. И не только предметы, но и события, и все остальное. Каковы бы ни были потребности, это ядро должно быть способно принимать что угодно и в неограниченном количестве и управлять им должным образом. Кроме того, чтобы быть читаемым и для программиста. Подобно дереву. Ствол дерева очень виден и его легко найти, а листья-это объекты, прикрепленные к этому стволу дерева(или сердцевине).
-
Как я уже сказал, Я не программист, Я художник. Я надеюсь, что вы можете дать мне свое мнение, далее.
_Q12_
"Шаблоны проектирования" - это книга? или это глава на языке c#? Я не очень хорошо в этом разбираюсь.
Я ничего не знаю о MVC.
Но мне нравится, как вы просто приводите пример: "связь между кучей объектов, называемых Datahold, подключенных через контроллеры (классы, которые выполняют эту работу) к пользовательскому интерфейсу, который должен быть более тупым."
-
Это очень близко к тому, что я себе представляю, только на практике это ваааааааай сложнее, чем кажется. Полагаю, дело в том, чтобы привыкнуть к такой конструкции. Верно?
-
Моя большая проблема заключается в том,как распространить их - весь код (obj,события,clases, все) в одном файле? Или каждая вещь в этом отдельном файле? например, иметь 1000 файлов для всей программы. Я пытаюсь визуализировать структуру здесь, поэтому я спрашиваю, как лучше всего подойти. Лучше всего, может быть, это большое слово, но как вы, ребята, делаете это из своей практики, это все, что я спрашиваю.
HobbyProggy
Рад, что вы получили немного того, на что я хотел указать, и да, это проблема для большинства программистов, так как это работа архитектора. Это трудно для всех, но с опытом и " шаблонами дизайна "мы справляемся с этим, потому что знаем, как это сделать, и у нас есть для этого" инструменты". Так что вы, вероятно, достаточно хороши, но вам не хватает опыта.
-
Чтобы спроектировать шаблоны, это не книга, это слово для набора конструктивных структур, которые вы можете использовать. Так что есть севаральские книги и статьи в Википедии об этом.
-
К.Dll-файлы, я думаю, вы знаете, для чего они нужны? Если нет, то просто запрограммируйте небольшое программное обеспечение, которое имеет 2 файла проекта, Один из которых настроен на компиляцию как dll, а другой-как исполняемый файл. Исполняемый проект нуждается в проекте dll в качестве ссылки и видит, как происходит "волшебство".
"Проект. dll" (если его можно так назвать) - это просто файл проекта, состоящий из классов, представлений, всего того, что может быть использовано реальными "проектами.exe". Таким образом, вы создаете модульную систему, способную изменять одну часть без" необходимости " прикасаться к другой.
-
Бизнес-класс для меня - это класс, который занимается бизнесом (забавно, правда?), Например, у меня есть пользовательский интерфейс, который отображает набор данных (подумайте о листе Excel). Я нажимаю на отображение данных -> пользовательский интерфейс теперь вызывает его контроллер и запрашивает данные -> контроллер запрашивает у бизнес-класса данные, которые он хочет -> бизнес-класс теперь выполняет свою работу и использует базовый модуль для получения запрошенных объектов . Как только бизнес-класс получает объекты, он передает их контроллеру -> контроллер сохраняет их в своем хранилище данных и заполняет данными пользовательский интерфейс. Вуаля, вы видите данные на экране. Поскольку это всего лишь пример, он может не соответствовать вашему случаю на 100%, но я надеюсь, что вы понимаете это. И хотя это звучит сложно, оно того стоит, поскольку вы можете изменить на каждом слое без необходимости (иногда вам может потребоваться изменить) что-то менять в других частях.
Чтобы сказать это в одном предложении: "бизнес-класс должен быть классом, который посвящен ровно одной работе или предмету и имеет код "производство/бизнес" для этой работы или предмета".
-
Я могу сказать вам, что это ядро, о котором вы говорите, существует, поскольку каждое приложение нуждается в сердце, которое продолжает качать. Как будет выглядеть" ядро", вы должны выяснить сами. Но вам не нужно создавать ядро, а затем переключаться на другие вещи. Сделайте это так, как вы думаете, вы найдете решение. Может быть, начать с объектов и выяснить, как их соединить. Вы должны найти свой способ создания системы, никто не может научить вас этому, мы просто можем дать подсказки или перспективы, как мы это сделаем.
-
Это, безусловно, самое сложное, но если вы правильно используете свои инструменты, вы можете построить ядро, а затем отделить его, расширить, снова отделить, и у вас, наконец, будет ядро, состоящее из нескольких классов, работающих вместе и приводящих машину туда, где она вам нужна. Вы художник, подумайте о картине, вы начинаете с одной точки и заполняете ее, вы разделяете взгляды на объекты на ней и конкретизируете ее по частям, чтобы сделать окончательную целую картину, верно? Это просто так, но более технически :)
-
MVC - один из наиболее часто используемых (надеюсь, я прав :) ) паттернов, хотя он выталкивается MVVM, который является еще одним паттерном, который я не могу объяснить очень хорошо ^^.
Идея MVC (Model-View-Controler) состоит в том, чтобы сохранить пользовательский интерфейс как пользовательский интерфейс, который является тупым и просто представляет данные. Контроллер выполняет эту работу, запрашивая данные или запихивая их в пользовательский интерфейс. Модель-это фактический объект данных, который удерживается контроллером. Идея заключается в том, что если пользовательский интерфейс запрашивает обновление, то контроллер делает это, а если модель обновилась, то контроллер запихивает ее в пользовательский интерфейс. Вы можете изменить пользовательский интерфейс и позволить контроллеру быть и наоборот, то же самое касается изменений в модели, так как все хорошо разделено и имеет свою специальную работу.
-
И да, это вопрос попадания в него, как только у вас есть опыт, вы создаете свои собственные шаблоны в соответствии с вашими предыдущими шагами и будете легче брать на себя такую работу.
-
Способ 2, это звучит как много, но вы увидите, что это меньше, чем 1000 файлов
_Q12_
Я делаю практический код после вашего объяснения, чтобы лучше понять, что вы объясняете. Только если вы чувствуете потребность или удовольствие исправить это, пожалуйста, сделайте. Я старался как можно ближе подойти к тому, что вы там сказали. Это немного умопомрачительно для меня. Мне определенно нужна практика с этим материалом. Вы полностью помогаете прямо сейчас!!
-
весь код здесь:
-
использование системы;
использование системы.Коллекции.Общий;
использование системы.ComponentModel;
используя системы.Сведения;
использование системы.Рисование;
использование System. Linq;
используя системы.Текст;
использование системы.Окна.Формы;
пространство имен WindowsFormsApplication4
{
общественности частичного класс form1 : форма
{
открытый form1()
{
метод InitializeComponent();
}
//вот запросы пользовательского интерфейса:
частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
Бизнес b = новый бизнес();
б.ИП();
этикетка 1.Текст = б.ИП();
}
}
// это полезно для компартиментализации / наслоения-теперь я вижу.
// если я не ошибаюсь, этот класс выглядит очень близко к моей основной штуке. Верно? Ocieni interesnaia :)
общественный класс Бизнес
{
публичный строковый пользовательский интерфейс()
{
if (Controller ()! = null) return Controller();
else return " ошибка: контроллер пуст";
//эта другая часть бессмысленна - у меня есть внутри контроллера еще один другой, который делает то же самое !!!
}
регулятор публичных строку ()
{
Бизнес b = новый бизнес();
Basic_Module bm = новый Basic_Module();
// только так я могу истолковать ваше утверждение: "контролер спрашивает, Что это бизнес-класс" +
// + "бизнес-класс теперь выполняет эту работу и использует базовый модуль для получения запрошенных объектов"
if (b. Contains(bm. Data01 ()))/ / если вы видите одни и те же данные в обоих местах(здесь, в бизнесе, и в Basic_Module)? тефак?
{
вернуться Data01();
}
ещё
{
возвращение "никакой текстовой информации";
}
}
public bool содержит (строковые данные)
{
if (data != null) возвращает true;
else return false;
}
общественного строка Data01()
{
возврат "большого количества текстовых данных";
}
}
публичный класс Basic_Module
{
общественного строка Data01()
{
возврат "большого количества текстовых данных";
}
}
}
HobbyProggy
Близко, но не 100% ;)
Вот "правильный" порядок того, что я сказал.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form, Interface1
{
Controler _c = null;
public Form1()
{
InitializeComponent();
_c = new Controler(this);
}
public void SetUI(string Data)
{
label1.Text = Data;
}
//here is the UI Requests:
private void button1_Click(object sender, EventArgs e)
{
_c.GetData();
}
}
//The Business Class
public class Business
{
public string UI()
{
string _uiData = "";
Base _base = new Base();
_uiData = _base.requestDataFromDatabase();
return _uiData;
}
}
//The controler Class
public class Controler
{
Interface1 _view = null;
public Controler(Interface1 View)
{
_view = View;
}
public void GetData()
{
Business _b = new Business();
string _data = _b.UI();
_view.SetUI(_data);
}
}
public class Base
{
//Somehow this grabs data with specified methods
public string requestDataFromDatabase()
{
string _data = "";
//Grab data
_data = "Hello";
//If Data is bad
if (string.IsNullOrEmpty(_data))
{
return "No Data";
}
else
{
return _data;
}
}
}
public interface Interface1
{
void SetUI(string Data);
}
}
Я забыл интерфейс, чтобы было более понятно, как работает разделение, я добавил его сейчас. Как вы можете видеть в интерфейсе, вы объявляете метод head. Это означает, что все, что вы меняете внутри метода, пока голова не затронута, не имеет значения для остальных ваших классов.
Кстати, это очень сложно, с большим количеством шестеренок, работающих на нем, так что если вы хотите просто сделать это. Как я уже говорил, начинайте и отделяйтесь время от времени, и вы получите представление о том, как это работает. Трудно, но эффект обучения больше.
* Обновил код, чтобы он работал, кое-что забыл ^^* я не часто программирую без своей IDE.
_Q12_
Спасибо Вам за ваш код! Она действительно очень развита. Не могу сказать, что многое из этого я понял, только часть. Я вставляю его в свой VS 2010, и я получаю много красных волнистых линий по всему коду. Может быть, это псевдокод?
-
Мне давно рассказывали об интерфейсах, я их просматриваю, но толку от них мало. Они должны быть из более широкого контекста, который я пока не понимаю. Я понимаю, что они делают, но когда я пытался использовать их, это очень запутывало все, и я оставлял это в покое.
-
Я очень ценю все, что вы мне рассказали. Но в этой части с вашим кодексом я потерян, если быть искренним. Из того, что я могу понять, в обоих кодах мы используем это расслоение, используя разные классы. Работая над своим кодом (до вашего кода), я пытаюсь добавить возможность обновления, и это беспорядок. Это очень трудно реализовать и проследить визуально и логически, разделяя одно и то же во многих классах. Но, может быть, это потому, что мой код очень простой и не настолько продвинутый. Ваш код должен быть переведен на что-то базовое, как это сделал я. - Нет?
_Q12_
Ваш код можно преобразовать во что-то более простое ? Я имею в виду, не для того, чтобы узнать что-то новое, а чтобы сделать это с тем, что я уже знаю. То, что я спрашиваю сейчас, звучит глупо, я знаю. В конце концов я научусь всему высокоуровневому, но..... Сначала я должен попытаться ткнуть в куст.
_Q12_
Кроме того, что такое хорошая книга/учебник по этому предмету, которую я могу продолжить/прочитать/посмотреть ?
-
У меня уже есть предложение от нашего друга Ричарда Маккатчана с книгой: .NET Book Zero Чарльза Петцольда - я ее прочитаю.
HobbyProggy
Кстати, извините за поздний ответ, я забыл отправить свой ответ в пятницу, и у меня не было времени на выходные.
HobbyProggy
У меня были некоторые ошибки в коде, но теперь я обновил его.
Интерфейсы полезны, но вы можете работать и без них, это вопрос того, как вы хотите спроектировать свою структуру :)
Я надеюсь, что с обновленным кодом вы лучше разберетесь в нем, я бы с удовольствием помог вам дальше, но боюсь, что время-это ограничивающий фактор, и научить вас целому исследованию информатики с помощью такой платтформы невозможно :)
_Q12_
О, вы мне очень помогли ! Спасибо Вам за все ответы ! Мне чрезвычайно любопытно, как работают и думают другие люди - я занимаюсь программированием в качестве хобби, совсем один. Я не программист. Вот почему я спрашиваю. Извиняюсь. :) Хорошего вам следующего года, в 2017-м.
-
как всегда...
В12