RemComm
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору У вас, действительно, слабый бекграунд в ООП. Это и есть основная причина. Вы пытаетесь применить ООП, используя свои навыки процедурного программирования. Это не сработает, потому что, свое, хорошо знакомое, всегда (!) работает лучше. Это надо ломать. Конечно, не имея практики построения дизайнов и архитектур кода и данных вы не сможете описать хороший тип данных в ООП. Как бы вы ни старились. Потому что бекграунда нет. Вам ООП зачем, если вы его не разумеете? Если процедурный стиль вам проще и понятней и (главное) кажется вам лучше - то используйте его. На ООП перейдете, когда для вас станут очевидны его преимущества. Как они вам станут очевидны - никто не знает. Просто вы пишете много кода и использованием ООП и сравниваете его с тем, как бы вы реализовали его с применением процедурного подхода. И это и будет ваш бекграунд. Через какое-то время (может - пара месяцев, может - пара лет), картина для вас станет проясняться и вы сделаете себе мнение. Какое-то время должно пройти. Потом вы поймете, что ООП - есть расширение ПП, только и всего. Цитата: Очевидно, что класс такой будет статический, в нем буквально два параметра | Совсем не очевидно. Как раз наоборот - нет никаких причин быть ему статическим. И даже наоборот - от никак не сможет быть статическим. Но да то такое... Если для представления данных подходит какой-то из стандартных типов данных - то лучше использовать их. (Стандартные, это те, которые предоставляет .Net). В данном случае, вы неверно реализуете представление, пытаясь все-все-все обернуть в свои типы. ООП - он вовсе не про это. Зачем для этого класс вообще? Вы и теперь можете просто задать источник для комбо. ООП не заставляет вас все оборачивать в свои типы. Как уже написал ранее - можно обходиться стандартными типами. Список - он же и есть список. Делаете List<string>() (или какого типа у вас данные... Currency - наверно, строкового), В цикле обрабатываете данные из датаридера и добавляете ваши валюты в лист. Потом этот лист указываете как источник для combobox. Если надо в комбобоксе вывести названия, а в Selected получить код валюты, то прост используйте словарь: Dictionary<string, int>() (допустим, Currency - строковый и CurrencyCode - цифровой). Так же, в цикле, обрабатываете датаридер и добавляете все валюты в словарь. Потом этот словарь передаете как источник в cоmbobox. Всего 5 строк кода. Можно обойтись и без цикла, если использовать метод ридера AutoMap() или LINQ. ООП (в принципе), есть группировка каких-то данных и методов их обработки в некую единую сущность - тип. Создавая экземпляр типа - объект, вы получаете все определенные свойства и методы как неотъемлемую часть этого объекта. Например, те же заказы. В ПП вы отдельно опишете процедуры валидации заказов, их получения и сохранения. В ООП можно сделать тип данных Заказ и валидацию сделать неотъемлемой частью типа. Для получения и сохранения заказов можно сделать тип ДиспетчепрЗаказов и получение/сохранение заказов сделать частью логики диспетчера. Тогда, можно написать как-то так: Код: public class Order { public int OrderId {get; private set} public DateTime OraderDate {get; private set} public int Value {get; set} public Order(int ordId, DateTime ordDT) { OrderId = ordId; OrderDate = ordDT; } public Order(int ordId, DateTime ordDT, int val) : this(ordId, ordDT) { Value = val; } public bool Validate() { return Value > 0 ? true : false; } } | Код: public class OrderDispatcher { public Order Get(int ordId) { // code to get order by Order ID; return ord; } public bool Store(Order ord) { // code to store order somewhere; return opresult; } } | Код: OrderDispatcher ordDisp = new OrderDispatcher(); Order ord1 = ordDisp.Get(148); ord1.Value = 12345; if (ord1.Validate()) { ordDisp.Save(ord1); } else { // process invalid order; } | Таким образом, вы знаете, что если у вас есть некий заказ, то вы легко можете его провалидировать просто вызвав соответствующий метод, потому что в такой реализации, валидация является неотъемлемой частью заказа. В ПП надо было бы вызвать функцию валидации заказа, в которую надо было бы передать все данные из ордера, что не так удобно, как простой вызов метода. Если у вас несколько разных типов заказов и для них нужны разные валидаторы, то в ПП вы их опишете функциями/процедурами, которые не будут привязаны к типам заказов. В ООП вы привяжете конкретный валидатор к конкретному типу заказа. По аналогии с ПП, члены типа - данные и код, логически связанные концепцией типа и сгруппированные в этот самый тип. Поля и свойства типа - это переменные/константы, а методы - подпрограммы или функции. Теперь, представим, есть задача: Надо создать в памяти 5 (абстрактных) заказов и выполнить некую аналитику в которой одновременно обрабатываются все 5 заказов. Все заказы имеют одинаковую структуру из 8 полей (произвольного типа), обязательных к заполнению. В ООП можно сделать так: - Один раз объявить тип Order, в котором описаны все 8 полей и методы валидации. - Один раз объявить тип Analytic, в котором описаны все аналитические методы и вывод на монитор или в файл или в базу. Допустим, аналитика требует предварительной инициализации, поэтому там есть параметрический конструктор, принимающий три (каких-то) параметра. потом весь код будет состоять всего из 7 строк: Пять раз инстанциируется тип Order (создается пять заказов) Один раз инстанциируется тип Analytic И один раз вызывается аналитический метод. Код: Order ord1 = new Order (p1, p2, p3, .... p8); Order ord2 = new Order (p1, p2, p3, .... p8); Order ord3 = new Order (p1, p2, p3, .... p8); Order ord4 = new Order (p1, p2, p3, .... p8); Order ord5 = new Order (p1, p2, p3, .... p8); Analytic sam = new Analytic (p1, p2, p3); sam.Process(ord1, ord2, ord3, ord4, ord5); | Ну и все , пожалуй. Все видно и понятно, хоть и мало отличается от ПП. Вся реализация убрана под капот именно за счет ООП. Чистое ПП такой простоты не даст. За для интереса спросите у гугля про "разница между процедурным программированием и ООП". Там, наверняка, найдется полезное и интересное чтиво. Навоза там, да, много, но и жемчуг в нем тоже есть. | Всего записей: 838 | Зарегистр. 30-09-2003 | Отправлено: 19:18 13-10-2019 | Исправлено: RemComm, 03:42 14-10-2019 |
|