Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Гляньте код скажите что сделано не грамотно? С точки зрения ООП 
:(
    Опции темы
source777
Дата 11.8.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



Цитата(WaReZMEN @  11.8.2008,  12:38 Найти цитируемый пост)
source777, это прям в редакторе тоесть какбы каментрий в классе?
так ?
Нет, не так. Теперь стало очевидно, что ты не умеешь писать комментарии... Пора учиться... Пиши псевдокод, который будет оставаться, после написания кода, в виде комментариев.

Пример:
Код

         public void Draw(Graphics Canvas)
        {
            // Создаём кисть для заливки и карандаш для обводки контура
            // Инициализируем их цвета свойствами рамы
            // Строим полигон, используя геометрические свойства рамы
            // Заливаем полигон рамы кистью заливки.
        }

........
позже псевдо-код превращается в реальный код, каждой строке псевдокода обычно соответствует 1-7 строк реального кода.
Код

         public void Draw(Graphics canvas)
        {
            // Создаём кисть для заливки и карандаш для обводки контура
            // Инициализируем их цвета свойствами рамы
            SolidBrush fillingBrush = new SolidBrush(this.FillingColor);
            Pen contourPen = new Pen(this.ContourColor);
            // Строим полигон, используя геометрические свойства рамы
            this.DrawPoligon(canvas, fillingBrush);
            // Заливаем полигон рамы кистью заливки.
            this.FillPoligon(canvas, contourPen);
        }

........
Псевдокод помог нам понять, что инициализировать кисти и карандаши жёлтым цветом бессмысленно и не нужно, а также что процедуры построения и заливки полигона лучше централизовать, и создав тем самым точку управления, вынести в базовый класс. Более того, мы видим, что сам метод Draw стал настолько ясным и универсальным, что и сам подлежит выносу в базовый класс как невиртуальный. Методы же DrawPoligon и FillPoligon следует сделать виртуальными.

P.S. Идея ясна? теперь пиши псевдокод для всех остальных методов... реальный код пока не пиши (ни в коем случае)!!!.


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
WaReZMEN
Дата 12.8.2008, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



Вот написал

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace WinConstructor
{

    public enum Alignment //Для Профилеи и стекл
    {
        None = 0,
        Client = 1,
        Left = 2,
        Top = 3,
        Rigth = 4,
        Bottom = 5
    }

    public enum Orientation //Для разделителей (Импостов)
    {
        Horizontal = 100,
        Vertical = 101
    }

    public enum MouseState //Для мыши 
    {
        msNone = 0,
        msImpostHorizontal = 200,
        msImpostVertical = 201,
        msMouseDown = 202
    }
  
 
    public class WindowFrame : WindowComponent
    {
        private List<Profile> ProfileList = new List<Profile>();

        public  WindowFrame() //Создание рамы
        {
           // Задаем размеры рамы
           // Создаем 4 профиля           
        }
    }

    public class Separator : WindowComponent
    {
        public  Separator()
        {
            // Задаем радительское стекло
            // Задем координаты ценрта разделителя
            // Задаем тип разделителя
            // Задаем цвета заливки, карандаша и цвет выделенного разделителя
            // Расчитываем координаты разделителя
            // Добавляем разделитель в список
        }

        public void Move() // Перемещение расдилителя
        {
            // Определяем какой разделитель выделен 
            // Задаем новые координаты центра выделеного профиля
            // Пересчитываем координаты профиля
            // Пересчитываем координате смеждых стекл
           
        }
       
        override public void DrawPoligon(Graphics Canvas, SolidBrush FillingBrush)
        {
            // Определяем тип расделителя
            // Расчитываем координаты расделителя
            // Рисуем расделитель
        }

        override public void FillPoligon(Graphics Canvas, Pen BorderPen)
        {
            // Заливаем расделитель
            // Рисуем границу расделителя
        }
    }

    public class Profile : WindowComponent
    {

        public Profile()
        {
            // Задаём положения  профиля
            // Задаем цвета заливки, карандаша и цвет выделенного профиля
            // Запомнинаем радительскую раму
            // Расчитываем координаты профилей 
            // Добавляем профиль в список
        }

        override public void DrawPoligon(Graphics Canvas, SolidBrush FillingBrush)
        {
            // Определяем тип выравнивания
            // Расчитываем координаты профиля
            // Рисуем профиль
        }

        override public void FillPoligon(Graphics Canvas, Pen BorderPen)
        {
            // Заливаем профиль
            // Рисуем границу профиля
        }
    }

    public class Pane : WindowComponent
    {
        public Pane(Alignment PaneAlignment)
        {
            // Задаём выравнивание стекла 
            // Задаем цвета заливки, карандаша и цвет выделенного стекла
            // Запомнинаем радительскую раму
            // Расчитываем координаты стекла 
            // Добавляем стекло в список
        }

        override public void DrawPoligon(Graphics Canvas, SolidBrush FillingBrush)
        {
            // Определяем тип выравнивания
            // Расчитываем координаты стекла
            // Рисуем стекло
        }

        override public void FillPoligon(Graphics Canvas, Pen BorderPen)
        {
            // Заливаем стекло
            // Рисуем границу стекла
        }
    }

    public class Window : WindowComponent 
    {
        private WindowFrame WinFrame;
        private List<Separator> SeparatorList = new List<Separator>();
//        private List<Profile> ProfileList = new List<Profile>();//Решил перенести этот список в класс WindowFrame
        private List<Pane> PaneList = new List<Pane>();

        public Window()
        {  
            //Задаем размеры основной конструкций
            //Создаем раму
            //Создаем стекло
        }

        public void DropSeparator(Orientation ImpostOrientation)
        {
            //Передераем все стекла
            //Определяем какое стекло выделено
            //Создаем разделитель (Импост) превязаный к этому стеклу
            //Создаем еще два стекла родитель каторых выделеное стекло
            //Определяем тип разделителя (Вертикальный-горизонтальный)
        }
    }

    public abstract class WindowComponent 
    {
        private int height;
        private int width;
        private Point topleftpoint;
        private bool select;

        public int Height
        {
            get { return height; }
            set { height = value; }
        }

        public int Width
        {
            get { return width; }
            set { width = value; }
        }

        public Point TopLeftPoint
        {
            get { return topleftpoint; }
            set { topleftpoint = value; }
        }

        public bool Selected
        {
            get { return select; }
            set { select = value; }
        }

        public void Draw(Graphics Canvas)
        {
            // Создаём кисть для заливки и карандаш для обводки контура
            // Инициализируем их цвета свойствами рамы
            // Строим полигон, используя геометрические свойства рамы
            // Заливаем полигон рамы кистью заливки.            
        }

        virtual public void DrawPoligon(Graphics Canvas, SolidBrush FillingBrush)
        {
            // Расчет полигона и его рисование
        }

        virtual public void FillPoligon(Graphics Canvas, Pen BorderPen)
        {
            // Заливка полигона
        }
         
    }

Так теперь диаграма классов выглядит
user posted image

PM MAIL ICQ   Вверх
source777
Дата 12.8.2008, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



Цитата(WaReZMEN @  12.8.2008,  02:22 Найти цитируемый пост)
DropSeparator
Название метода предполагает, что он удаляет разделитель, что не согласуется с псевдокодом, надо чтобы согласовалось! либо переименовывай в AddSeparator, либо меняй псевдо-код.

В целом уже гораздо лучше, теперь следует выделить каждый класс в отдельный одноимённый файл, затем реализуй абстрактный класс и класс рамы. Кстати методы FillPoligon и DrawPoligon в абстрактном классе надо пометить как abstract, а не virtual... т.к. они на уровне абстрактного класса не могут иметь адекватной реализации.



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
WaReZMEN
Дата 12.8.2008, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



source777, Так сделал что дальше?
PM MAIL ICQ   Вверх
source777
Дата 12.8.2008, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



ну если уверен в реализации, то реализуй остальные классы...


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
WaReZMEN
Дата 12.8.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



source777
Вот реализайция абстрактного класса мне правда кажется нужно еще добавить масив с 4мя координатами для профилеи, стекл и перегоротки. А поповоду класса Рама его нет смысла деть без реализаций класса Профиль.
Код

    public abstract class WindowComponent
    {
        private int height;
        private int width;
        private Point topleftpoint;
        private bool select;
        private Color fillingcolor;
        private Color bordercolor;

        public int Height
        {
            get { return height; }
            set { height = value; }
        }

        public Color FillingColor
        {
            get { return fillingcolor; }
            set { fillingcolor = value; }
        }

        public Color BorderColor
        {
            get { return bordercolor; }
            set { bordercolor = value; }
        }

        public int Width
        {
            get { return width; }
            set { width = value; }
        }

        public Point TopLeftPoint
        {
            get { return topleftpoint; }
            set { topleftpoint = value; }
        }

        public bool Selected
        {
            get { return select; }
            set { select = value; }
        }

        public void Draw(Graphics Canvas)
        {
            // Создаём кисть для заливки и карандаш для обводки контура
            SolidBrush FillingBrush = new SolidBrush(this.FillingColor);
            Pen BorderPen = new Pen(this.BorderColor);
            // Строим полигон, используя геометрические свойства рамы
            this.DrawPoligon(Canvas, FillingBrush);
            // Заливаем полигон рамы кистью заливки. 
            this.FillPoligon(Canvas, BorderPen);
        }

        abstract public void DrawPoligon(Graphics Canvas, SolidBrush FillingBrush);


        abstract public void FillPoligon(Graphics Canvas, Pen BorderPen);

    }

PM MAIL ICQ   Вверх
source777
Дата 12.8.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



Цитата(WaReZMEN @  12.8.2008,  13:27 Найти цитируемый пост)
мне правда кажется нужно еще добавить масив с 4мя координатами для профилеи, стекл и перегоротки.
Методы DrawPolygon и FillPolygon будут делегировать расчёт координат методу GetPolygonPoints(), который в свою очередь вернёт массив точек, сохранять этот массив нигде не надо. Кстати переименуй Poligon в Polygon... а то орфографическая ошибочка вышла.. smile 



Цитата(WaReZMEN @  12.8.2008,  13:27 Найти цитируемый пост)
А поповоду класса Рама его нет смысла деть без реализаций класса Профиль.
Ну и что тебя останавливает? кстати обоснуй связь этих классов. Ведь если рама - это лишь коллекция профилей и ничего больше, значит рамы нет! есть только коллекция профилей, а в этом случае сам класс рамы следует удалить согласно принципу "Бритва Оккама".



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
WaReZMEN
Дата 13.8.2008, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



source777, а можно сдесь поподробнее?

Цитата

Методы DrawPolygon и FillPolygon будут делегировать расчёт координат методу GetPolygonPoints(), который в свою очередь вернёт массив точек, сохранять этот массив нигде не надо.


Это сообщение отредактировал(а) WaReZMEN - 14.8.2008, 00:54
PM MAIL ICQ   Вверх
WaReZMEN
Дата 14.8.2008, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



Вот класс Профиль
Код

   public class Profile : WindowComponent
    {
        private Alignment profileAlign;
        private WindowFrame parent;

        public Profile(Alignment Align, WindowFrame Parent)
        {
            // Задаём положения  профиля
            this.profileAlign = Align;
            // Задаем цвета заливки, карандаша и цвет выделенного профиля
            this.BorderColor = Color.Black;
            this.FillingColor = Color.FromArgb(250, 250, 250);
            this.FillingSelectColor = Color.FromArgb(182, 209, 255);
            // Запомнинаем радительскую раму
            this.parent = Parent;            
            // Добавляем профиль в список
            this.parent.ProfileList.Add(this);
        }

        public override void DrawPolygon(Graphics Canvas, SolidBrush FillingBrush)
        {
            // Определяем тип выравнивания
            // Расчитываем координаты профиля
            // Рисуем профиль
        }

        public override void FillPolygon(Graphics Canvas, Pen BorderPen)
        {
            // Заливаем профиль
            // Рисуем границу профиля
        }
    }



Это сообщение отредактировал(а) WaReZMEN - 14.8.2008, 02:28
PM MAIL ICQ   Вверх
source777
Дата 14.8.2008, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



Цитата(WaReZMEN @  14.8.2008,  02:28 Найти цитируемый пост)
            this.BorderColor = Color.Black;
            this.FillingColor = Color.FromArgb(250, 250, 250);
            this.FillingSelectColor = Color.FromArgb(182, 209, 255);
Что за магические числа? так не пойдёт!




Цитата(WaReZMEN @  13.8.2008,  10:20 Найти цитируемый пост)
а можно сдесь поподробнее?
Подробнее может быть лишь готовый код, а это ты должен сделать сам.



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
WaReZMEN
Дата 14.8.2008, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



source777
Цитата(source777 @  14.8.2008,  18:16 Найти цитируемый пост)
Что за магические числа? так не пойдёт!

Это цвета smile
Я не думаю что существует названия для всех цветов RGB smile. Или имелось ввиду что нужно сделать какието переменные???
PM MAIL ICQ   Вверх
source777
Дата 14.8.2008, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



Цитата(WaReZMEN @  14.8.2008,  14:27 Найти цитируемый пост)
Или имелось ввиду что нужно сделать какието переменные??? 
Не переменные а константы, если это действительно константы! Запомни, в коде методов допустимо только два числа 0 и 1, никаких других чисел внутри методов быть не должно! Причём название константы должно означать её смысл, а не значение, поэтому Color.Black тоже не подойдёт!



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
WaReZMEN
Дата 15.8.2008, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



source777, а разве не понято из левои части

            this.BorderColor = Color.Black;
            this.FillingColor = Color.FromArgb(250, 250, 250);
            this.FillingSelectColor = Color.FromArgb(182, 209, 255);
Я конечно вынесу от с названиями этих цветов будут деиствительно проблемы smile
Спасибо что все еще расказываете что да как smile
PM MAIL ICQ   Вверх
mihryak
Дата 15.8.2008, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



Цитата(source777 @  14.8.2008,  23:13 Найти цитируемый пост)
в коде методов допустимо только два числа 0 и 1, никаких других чисел внутри методов быть не должно! 

а я вот пополам делю порой, это смертельно?  smile

а с цветами я бы вместо констант
Код

private const int FillingColorRedValue = 250;
private const int FillingColorBlueValue = 250;
private const int FillingColorGreenValue = 250;

использовал всё же readonly
Код

private static readonly Color fillingColor = Color.FromArgb(250, 250, 250);

PM MAIL ICQ   Вверх
source777
Дата 15.8.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



Цитата(mihryak @  15.8.2008,  00:50 Найти цитируемый пост)
а я вот пополам делю порой, это смертельно?  smile
нет конечно, естественно это утверждение было специально усилено для большего воспитательного эффекта. Изредка допустимы и другие числа, но лишь изредка.



Это сообщение отредактировал(а) source777 - 15.8.2008, 11:03


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1101 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.