Оцените общее качество кода
От: Философ Ад http://vk.com/id10256428
Дата: 14.09.11 10:07
Оценка: 1 (1)
Код целиком мой, это контрол из нэймспэйса, который писал я для одного из заказанных проектов.
Коду примерно 2 года. Изначально он выглядел немного не так, т.е. пару раз дописывался/переделывался.

Примерно год назад я сломал namespace своими экспериментами и переделками (привёл в некомпилируемое состояние), поправить до сих пор руки не дошли.
Однако общая идеалогия осталась, и большая часть функционала работает (если закомментировать некомпилирующееся).

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

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

using DataSqlEngine;



namespace GuiDbEngine
    {
    public partial class CSelector : UserControl
        {
        #region Delegates

        public delegate void CFilterCasesDelegate(CQueryFilterSet oFltSet);

        #endregion

        protected IGuiDatabaseApplication App;
        private FilterDataForm ff;
        protected CSelectorBehaviourType m_ChildWindowBehaviour;
        private CAbstractEntityView m_CreatedEntityView;


        private BaseDBControl m_DBOControl = null;
        private bool m_ShowButons = true;
        private bool m_ShowDbControl = false;
        private bool m_ShowSearchPanel = false;
        private bool m_CloseOnSelect = false;

        public CSelector(CSelectorBehaviourType pWindowBehaviourType)
            {
            InitializeComponent();
            CreateGrid(null);
            this.SelectorBehaviour = pWindowBehaviourType;
            }


        public CSelector(AbstractCollection pSelectorController, CSelectorBehaviourType pWindowBehaviourType)
            {
            if (pSelectorController == null)
                {
                throw new ArgumentException();
                }
            InitializeComponent();
            this.SelectorBehaviour = pWindowBehaviourType;
            CreateGrid(pSelectorController.EntityType);
            m_SeletorGrid.Collection = pSelectorController;
            }


        public CSelector()
            {
            InitializeComponent();
            CreateGrid(null);
            }


        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public CAbstractEntityView DBODBOView
            {
            get { return m_DBOControl.EntityView; }
            }


        [Browsable(false)]
        public bool CloseOnSelect
            {
            get { return m_CloseOnSelect; }
            set { m_CloseOnSelect = value;}
            }


        [Browsable(true)]
        public bool DbControlVisible
            {
            get { return m_ShowDbControl; }
            set
                {
                if (DbControlVisible == value)
                    {
                    return;
                    }
                m_ShowDbControl = value;
                if (m_DBOControl == null)
                    {
                    CreateDBOControl();
                    }
                SetupSizeAndPosition();
                }
            }


        [Browsable(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public AbstractCollection Collection
            {
            get { return m_SeletorGrid.Collection; }
            set
                {
                if (value == null)
                    {
                    splitContainerMain.Visible = false;
                    //m_SeletorGrid.Visible = false;
                    //ButonsPanelVisible = false;
                    return;
                    //throw new ArgumentNullException("value", "недопустимое знаение null");
                    }
                splitContainerMain.Visible = true;
                AbstractCollection collection = value;
                UserControl tmpCtrl = m_DBOControl;

                SuspendLayout();
                if (m_SeletorGrid != null)
                    {
                    if (m_SeletorGrid.Collection != null)
                        {
                        if (m_SeletorGrid.Collection == value)
                            {
                            ResumeLayout();
                            return;
                            }
                        Type typedbo = m_SeletorGrid.Collection.EntityType;
                        Type typenewgrid = App.GUIBroker.GuiAbstractFactory.GetGridType(typedbo);

                        if (m_SeletorGrid.Collection.GetType() == typenewgrid)
                            {
                            m_SeletorGrid.Collection = collection;
                            return;
                            }
                        }
                    else
                        {
                        m_SeletorGrid.Dispose();
                        m_SeletorGrid = null;
                        }
                    }

                if (m_DBOControl != null)
                    {
                    tmpCtrl.Dispose();
                    m_DBOControl = null;
                    }

                collection = value;
                CreateGrid(collection.EntityType);
                m_SeletorGrid.Collection = collection;
                bool enableFiltering = false;
                try
                    {
                    enableFiltering = collection.PotentialCriterions.Count > 0;
                    }
                catch(NotImplementedException e)
                    {
                    enableFiltering = false;
                    App.Log.LogException(e);
                    toolTip1.SetToolTip(btn_Filter, "Фильтрация не реализована (NotImplementedException)");
                    toolTip1.Active = true;
                    }
                btn_Filter.Enabled = enableFiltering;
                if (DbControlVisible)
                    {
                    CreateDBOControl();
                    }
                SetupSizeAndPosition();
                ResumeLayout(true);
                }
            }


        [Browsable(true)]
        public bool RefreshButtonVisible
            {
            get { return btnRefresh.Visible; }
            set { btnRefresh.Visible = value; }
            }

        [Browsable(true)]
        public bool SelectButtonVisible
            {
            get { return btnSelect.Visible; }
            set { btnSelect.Visible = value; }
            }

        [Browsable(true)]
        public bool FilterButtonVisible
            {
            get { return btn_Filter.Visible; }
            set { btn_Filter.Visible = value; }
            }

        [Browsable(true)]
        public bool ButonsPanelVisible
            {
            get { return m_ShowButons; }
            set
                {
                if (ButonsPanelVisible == value)
                    {
                    return;
                    }
                m_ShowButons = value;
                SetupSizeAndPosition();
                } //-----
            }

        [Browsable(true)]
        public bool SearchPanelVisible
            {
            get { return m_ShowSearchPanel; }
            set
                {
                m_ShowSearchPanel = value;
                m_SeletorGrid.ShowSearchPanel = value;
                }
            }

        [Browsable(true)]
        public bool EnableCreateButton
            {
            get { return button_Create.Enabled; }
            set { button_Create.Enabled = value; }
            }

        [Browsable(true)]
        public bool EnableEditButton
            {
            get { return button_Edit.Enabled; }
            set { button_Edit.Enabled = value; }
            }

        [Browsable(true)]
        public bool EnableDeleteButton
            {
            get { return button_Delete.Enabled; }
            set { button_Delete.Enabled = value; }
            }

        [Browsable(true)]
        public string CreateButtonText
            {
            get { return button_Create.Text; }
            set { button_Create.Text = value; }
            }

        [Browsable(true)]
        public CSelectorBehaviourType SelectorBehaviour
            {
            get { return m_ChildWindowBehaviour; }
            set { m_ChildWindowBehaviour = value; }
            }

        [Browsable(false)]
        public CSelectorGrid Grid
            {
            get { return m_SeletorGrid; }
            }

        [Browsable(false)]
        public CAbstractEntityView SelectedEntityView
            {
            get { return m_SeletorGrid.SelectedEntityView; }
            }

        [Browsable(false)]
        public AbstractEntry SelectedEntry
            {
            get { return m_SeletorGrid.SelectedEntry; }
            }


        public void Init(IGuiDatabaseApplication p_app)
            {
            if (p_app == null)
                {
                throw new ArgumentNullException("p_app");
                }
            App = p_app;
            }


        [
            Browsable(true),
            Category("SelectorBehavior")
        ]
        public event EventHandler SelectSingleRow;


        [
            Browsable(true),
            Category("SelectorBehavior")
        ]
        public string GetStringCurrentSelected(AbstractCollection p_Collection)
            {
            if (m_SeletorGrid.SelectedEntry != null)
                {
                return m_SeletorGrid.SelectedEntry.GetDataString();
                }
            return string.Empty;
            }


        protected void CreateGrid(Type TypeDBO)
            {
            if (TypeDBO == null)
                {
                m_SeletorGrid = new GridStub();
                }
            else
                {
                CSelectorGrid grid = App.GUIBroker.GuiAbstractFactory.CreateGrid(TypeDBO);
                m_SeletorGrid = grid;
                }
            // 
            // m_SeletorGrid
            // 
            m_SeletorGrid.Anchor = ((AnchorStyles.Top | AnchorStyles.Bottom)
                                    | AnchorStyles.Left)
                                   | AnchorStyles.Right;
            m_SeletorGrid.BorderStyle = BorderStyle.Fixed3D;
            m_SeletorGrid.Location = new Point(0, 0);
            m_SeletorGrid.Margin = new Padding(0);
            m_SeletorGrid.Name = "m_SeletorGrid";
            m_SeletorGrid.ShowSearchPanel = SearchPanelVisible;
            m_SeletorGrid.Size = new Size(Width, Height);
            m_SeletorGrid.TabIndex = 0;
            m_SeletorGrid.DoubleClickOrEnter += SeletorGrid_DoubleClickOrEnter;
            m_SeletorGrid.CreateNew += SeletorGrid_CreateNew;
            m_SeletorGrid.SelectSingleRow += SeletorGrid_SelectSingleRow;
            m_SeletorGrid.DeleteRows += SelectorGrid_Delete;
            splitContainerMain.Panel1.Controls.Add(m_SeletorGrid);
            m_SeletorGrid.EnableCreate = EnableCreateButton;
            m_SeletorGrid.EnableEdit = EnableEditButton;
            m_SeletorGrid.EnableDelete = EnableDeleteButton;
            m_SeletorGrid.Dock = DockStyle.Fill;
            m_SeletorGrid.SelectSingleRow += OnSelectSingleRow;
            }


        protected void OnSelectSingleRow(Object sender, EventArgs ea)
            {
            if (SelectSingleRow != null)
                {
                SelectSingleRow(this, EventArgs.Empty);
                }
            }


        private void SetupSizeAndPosition()
            {
            SuspendLayout();
            UserControl Control = m_DBOControl;

            splitContainerMain.Panel1Collapsed = false;
            splitContainerMain.Panel2Collapsed = false;
            splitContainerBottom.Panel1Collapsed = !ButonsPanelVisible;
            splitContainerBottom.Panel2Collapsed = !DbControlVisible;

            int BottomHeight = 0;
            if (ButonsPanelVisible)
                {
                BottomHeight += button_Create.Height + 2;
                }

            if (DbControlVisible)
                {
                BottomHeight += Control.Height + 2;
                }

            if ((Height - BottomHeight) < 0)
                {
                splitContainerMain.Panel1Collapsed = true;
                }
            else
                {
                splitContainerMain.SplitterDistance = Height - BottomHeight;
                }

            if (ButonsPanelVisible)
                {
                splitContainerBottom.SplitterDistance = 24;
                }

            if ((!ButonsPanelVisible) & (!DbControlVisible))
                {
                splitContainerMain.Panel2Collapsed = true;
                }

            //splitContainerBottom.Height = button_Create.Height + splitContainerBottom.SplitterDistance;
            ResumeLayout(true);
            }


        protected void CreateDBOControl()
            {
            if (m_DBOControl != null)
                {
                return;
                }
            Type DBOType = GetEntityType();
            if (DBOType == null)
                {
                m_DBOControl = new DBOControlStub();
                m_DBOControl.Width = Width;
                m_DBOControl.Height = 125;
                m_DBOControl.Text = "Ok";
                }
            else
                {
                m_DBOControl = App.GUIBroker.CreateControl(DBOType, TypeView.Edit);
                ;
                }
            m_DBOControl.BorderStyle = BorderStyle.None;
            splitContainerBottom.Panel2.Controls.Add(m_DBOControl);
            }


        protected void SeletorGrid_CreateNew(object sender, EventArgs e)
            {
            AbstractCollection collection = m_SeletorGrid.Collection;

            if (collection == null)
                {
                MessageBox.Show("Не присвоена коллекция");
                return;
                }
            this.m_CreatedEntityView = collection.CreateView();
            m_CreatedEntityView.OnAfterSave += AfterSaveCreatedView;

            Form frmParent = FindForm();
            TypeView tw = TypeView.Create;
            CAbstractGuiBroker guiBroker = App.GUIBroker;
            DBControlContainerForm ef =
                guiBroker.CreateAndFillDBEntityForm(frmParent, m_CreatedEntityView, tw, true);

            if (this.SelectorBehaviour.windowModality == WindowModality.OnTop)
                {
                ef.Show();
                }
            else
                {
                ef.ShowDialog(this);
                }
            }


        protected Type GetEntityType()
            {
            Type Result = null;
            AbstractCollection collection = m_SeletorGrid.Collection;
            if (collection != null)
                {
                Result = collection.EntityType;
                }
            return Result;
            }


        private void AfterSaveCreatedView(object Sender, CAbstractEntityView.EntityViewEventArgs ea)
            {
            Collection.Add(ea.Entity);
            m_CreatedEntityView.OnAfterSave -= AfterSaveCreatedView;
            }


        protected void SeletorGrid_DoubleClickOrEnter(object sender, EventArgs e)
            {
            if (m_SeletorGrid.SelectedEntityView == null)
                {
                MessageBox.Show("Нет выбранных строк");
                return;
                }
            if ((sender == m_SeletorGrid) && (this.SelectorBehaviour.SelectorBehaviour == GuiDbEngine.SelectorBehaviour.Select))
                {
                SelectData();
                return;
                }
            CreateFormWithControl(); //edit data
            }


        /// <summary>
        /// Информирует владельца коллекции о факте выбора пользователем элемента
        /// </summary>
        private void SelectData()
            {
            AbstractCollection collection = m_SeletorGrid.Collection;
            if (collection == null)
                {
                throw new InvalidOperationException("не присвоена коллекция");
                }
            CAbstractEntityView selectedEntityView = m_SeletorGrid.SelectedEntityView;
            if (selectedEntityView == null)
                {
                return;
                }

            collection.ItemWasSelected(SelectedEntry);
            m_SeletorGrid.ClearSearchString();
            }


        private void CreateFormWithControl() //edit data
            {
            CAbstractEntityView selectedEntityView = m_SeletorGrid.SelectedEntityView;
            if (selectedEntityView == null)
                {
                MessageBox.Show("Нет выбранных строк");
                return;
                }

            DBControlContainerForm ef = App.GUIBroker.CreateAndFillDBEntityForm(FindForm(), selectedEntityView, TypeView.Edit, true);
            if (this.SelectorBehaviour.windowModality == WindowModality.OnTop)
                {
                ef.Show();
                }
            else
                {
                ef.ShowDialog();
                }
            }


        protected void SelectorGrid_Delete(object sender, EventArgs e)
            {
            if (!EnableDeleteButton)
                {
                MessageBox.Show(this,
                                "НО ПАСАРАН " + Environment.NewLine + Environment.NewLine + "администратору расскажу!",
                                "удаление запрещено",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Stop);
                return;
                }
            AbstractCollection collection = m_SeletorGrid.Collection;
            if (collection == null)
                {
                throw new InvalidOperationException("не присвоена коллекция");
                }

            CAbstractEntityView selectedEntityView = m_SeletorGrid.SelectedEntityView;
            if (selectedEntityView == null)
                {
                MessageBox.Show("Нет выбранных строк");
                return;
                }
            string warnigText = selectedEntityView.GetCaption() + " = [" + selectedEntityView.GetDataString() + "]";
            warnigText += Environment.NewLine+Environment.NewLine;
            warnigText += "На неё могут ссылаться другие записи, которые также будут удалены";
            DialogResult dres =
                MessageBox.Show(this.FindForm(), warnigText,
                                "Отмена невозможна!   Вы действильно хотите удалить эту запись?",
                                MessageBoxButtons.YesNo,
                                MessageBoxIcon.Warning);
            if (dres == DialogResult.Yes)
                {
                collection.Delete(m_SeletorGrid.SelectedEntry);
                MessageBox.Show(this.FindForm(), "Вас предупреждали!", "Запись успешно удалена");
                }
            }


        protected void SeletorGrid_SelectSingleRow(object sender, EventArgs e)
            {
            if (DbControlVisible || null == m_DBOControl)
                {
                return;
                }
            CAbstractEntityView selectedEntityView = m_SeletorGrid.SelectedEntityView;
            if (selectedEntityView != null)
                {
                m_DBOControl.EntityView = selectedEntityView;
                }
            else
                {
                throw new InvalidOperationException();
                }
            }


        private void btnSelect_Click(object sender, EventArgs e)
            {
            SelectData();
            }


        private void btn_Filter_Click(object sender, EventArgs e)
            {
            if (Collection == null)
                {
                return;
                }
            if (ff == null)
                {
                CPotentialCriterionList CriterionList = Collection.PotentialCriterions;
                ff = FilterDataForm.CreateFilterDataForm(App.GUIBroker);
                ff.Text = "Фильтр";
                ff.TopLevel = false;
                ff.Parent = this;
                ff.SetPotentialCriterions(CriterionList);
                Controls.Add(ff);
                ff.OnCommandFilter += FilterCases;
                }
            ff.Show();
            Grid.SendToBack();
            ff.BringToFront();
            }


        private void FilterCases(CQueryFilterSet p_FltSet)
            {
            FilterSet = p_FltSet;
            m_SeletorGrid.UpdateData();
#if DEBUG
            DialogResult dr =
                MessageBox.Show(this,
                                this.Collection.GetResultQuery(p_FltSet),
                                "Выполнять запрос или нет?",
                                MessageBoxButtons.YesNo,
                                MessageBoxIcon.Warning);
            if (dr == DialogResult.No)
                {
                return;
                }
#endif
            Collection.Select(FilterSet);
            }

        private CQueryFilterSet FilterSet;
        private void UpdateClick(object sender, EventArgs e)
            {
            if (m_SeletorGrid.Collection != null)
                {
                m_SeletorGrid.Collection.Select(FilterSet);
                }
            }

        protected override void OnSizeChanged(EventArgs e)
            {
            base.OnSizeChanged(e);
            SetupSizeAndPosition();
            }


        public void Set( CSelectorSettings p_settings )
            {
            this.ButonsPanelVisible = p_settings.ButonsPanelVisible;
            this.SelectorBehaviour = p_settings.SelectorBehaviour;
            this.CreateButtonText = p_settings.CreateButtonText;
            this.DbControlVisible = p_settings.DbControlVisible;
            this.EnableCreateButton = p_settings.EnableCreateButton;
            this.EnableDeleteButton = p_settings.EnableDeleteButton;
            this.EnableEditButton = p_settings.EnableEditButton;
            this.FilterButtonVisible = p_settings.FilterButtonVisible;
            this.RefreshButtonVisible = p_settings.RefreshButtonVisible;
            this.SearchPanelVisible = p_settings.SearchPanelVisible;
            this.SelectButtonVisible = p_settings.SelectButtonVisible;
            this.CloseOnSelect = p_settings.CloseOnSelect;
            }
        }


    public enum eSelectorEventTypes
        {
        Select,
        Delete,
        Open,
        Create
        } ;


    public class SelectorEventArgs : EventArgs
        {
        private readonly AbstractEntry m_Entry;
        private readonly eSelectorEventTypes m_EventType;


        public SelectorEventArgs(AbstractEntry pEntry, eSelectorEventTypes pEventType)
            {
            m_Entry = pEntry;
            m_EventType = pEventType;
            }


        public AbstractEntry Entry
            {
            get { return m_Entry; }
            }

        public eSelectorEventTypes EventType
            {
            get { return m_EventType; }
            }
        }


    public delegate void SelectorDelegate(object Sender, SelectorEventArgs SelectorEA);
    }
Всё сказанное выше — личное мнение, если не указано обратное.
Re: Оцените общее качество кода
От: mogikanin Россия  
Дата: 14.09.11 10:27
Оценка:
Какую цель преследуешь, прося оценить качество кода?

По сути — непонятно для чего этот контрол предназначен, качество кода — так себе, похоже на студенческую поделку.
Re[2]: Оцените общее качество кода
От: Философ Ад http://vk.com/id10256428
Дата: 14.09.11 11:09
Оценка:
Здравствуйте, mogikanin, Вы писали:

M>По сути — непонятно для чего этот контрол предназначен


Это грид для отображения коллекций сущностей, подтягваемых из БД.
При двойном щелчке на строке грида открывается окно с контролом для редактирования сущности.
Грид предоставляет единообразный интерфейс создания сущности, редактирования, и выбора.


, качество кода — так себе, похоже на студенческую поделку.

возможно.
код переделывался не один раз.
и его никто не причёсывал (почти не причёсывал)
Всё сказанное выше — личное мнение, если не указано обратное.
Re[3]: Оцените общее качество кода
От: algol Россия about:blank
Дата: 14.09.11 11:17
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>, качество кода — так себе, похоже на студенческую поделку.


Ф>возможно.

Ф>код переделывался не один раз.
Ф>и его никто не причёсывал (почти не причёсывал)

Посмотрел по диагонали. Не понравились очепятка в m_SeletorGrid и пионерские тексты типа "НО ПАСАРАН ".
Re[4]: Оцените общее качество кода
От: Философ Ад http://vk.com/id10256428
Дата: 14.09.11 11:43
Оценка:
Здравствуйте, algol, Вы писали:

A>Здравствуйте, Философ, Вы писали:


Ф>>, качество кода — так себе, похоже на студенческую поделку.


Ф>>возможно.

Ф>>код переделывался не один раз.
Ф>>и его никто не причёсывал (почти не причёсывал)

A>пионерские тексты типа "НО ПАСАРАН ".


пользователи видели.
поулыбались, пока тестировали...
(удалить не говорили)
Всё сказанное выше — личное мнение, если не указано обратное.
Re: Оцените общее качество кода
От: uuu84  
Дата: 14.09.11 12:14
Оценка: :)
Ф> MessageBox.Show("Нет выбранных строк");

Запущенной программы тоже нет. Включённый компьютер на самом деле выключен. Да и самого юзера, пожалуй, не существует. Так и напиши: "чувак, тебя нет, понял?!". Как может не быть уже ВЫБРАННЫХ юзером строк??????????????

И это, подобные сообщения обычно помещаются либо в константы (для мелкой проги), либо в коллекцию строк. Чтобы можно было без геммора реализовать многоязычный интерфейс или просто изменять (за один приём) многократно повторяющуюся надпись.
Re: Оцените общее качество кода
От: abibok  
Дата: 14.09.11 17:23
Оценка: 1 (1)
В двух словах: код плох. Как по стилю, так и по смыслу. Больше читайте чужие исходники, это лучший способ научиться чувствовать, а потом и писать хороший код.
Re: Оцените общее качество кода
От: goondick  
Дата: 14.09.11 18:14
Оценка:
ох, молдеж-подростки... пиши ещче, не заморацивайся, все пучком, пиписька в норме...
Re[2]: Оцените общее качество кода
От: Философ Ад http://vk.com/id10256428
Дата: 14.09.11 18:50
Оценка:
Здравствуйте, abibok, Вы писали:

A>Как по стилю, так и по смыслу.


По смыслу что не понравилось?
Если можно, то не в двух словах.
Всё сказанное выше — личное мнение, если не указано обратное.
Re: Оцените общее качество кода
От: Олег К.  
Дата: 20.09.11 00:10
Оценка:
Ф>Код целиком мой, это контрол из нэймспэйса, который писал я для одного из заказанных проектов.
Ф>Коду примерно 2 года. Изначально он выглядел немного не так, т.е. пару раз дописывался/переделывался.

Что это за китайский стиль расставлять фигурные скобки?
Re[3]: Оцените общее качество кода
От: abibok  
Дата: 20.09.11 00:45
Оценка: 1 (1)
Навскидку:
1. Смесь русских и английских комментариев.
2. Отсутствие XML комментариев для public methods.
3. Несколько пустых строк идущие одна за другой или наоборот, слипшийся код без промежутков.
4. Закомментаренный код без пояснений почему так было сделано и когда такой код можно будет безопасно удалить.
5. Fields там где должны быть Properties (App, m_ChildWindowBehaviour).
6. Именование членов класса — и префикс m_, и без префикса, и вообще какое-то ff.
7. Именование параметров в методах и локальных переменных в методах — смесь сamelCase и PascalCase.
8. Префиксы венгерской нотации — pWindowBehaviourType, oFltSet. Классы начинающиеся с С.
9. Использование this там где в этом нет необходимости.
10. Hardcoded strings.
11. Детский сад с "НО ПАСАРАН администратору расскажу!"
12. Использование стиля MessageBoxIcon.Warning для Yes/No диалога.
13. Лишние ; там где они не нужны
14. Атрибуты, растянутые на несколько строк
15. Стиль расстановки { }
16. get/set properties в старом стиле (get { return x; } set { x = value}) вместо (get; set
17. set properties, которые делают дохрена всего и могут кидать исключения. Они должны быть методами.
18. Опечатки (Seletor,warnigText,ButonsPanelVisible)
19. Бессмысленные комментарии (//-----)
20. Бросание исключений без дополнительной информации.
21. Описание делегата SelectorDelegate в конце файла, и вообще порядок объявления private/protected/public.
22. То как используются регионы.

По сути код почти ничего не делает, но вызывает желание все переписать.
Re[4]: Оцените общее качество кода
От: Олег К.  
Дата: 20.09.11 04:40
Оценка:
A>По сути код почти ничего не делает, но вызывает желание все переписать.

Ну раз вызывает желание переписать, то, значит, он не так плох. Вот если бы такого желания не возникало, то тогда бы был точно плох!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.