C# - OOP - 我是否正沿着正确的轨道前进?

时间:2010-11-22 23:05:30

标签: c# oop

第一篇文章,长期读者。

我正在学习使用“Head First C#”的C#(我可以使用Encapsulation和Get / Set属性)

我正在写一个小程序为朋友处理图片,我只是想知道我是否正在使用PictureController类走向正确的路线?我的主要问题是我正在使用这个类设置很多表单项,并且从类中继续引用表单项感觉不自然,我在下面粘贴我的代码,如果你能让我知道我是否正在做有什么不对的,我会非常感激:)

非常感谢!

PictureController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;

namespace PictureController
{
    class PictureController
    {

        private int arrayPosition = 0;
        private int numFiles = 0;

        private string[,] arrayPictures;

        public PictureBox myPictureBox;
        public RadioButton myCopyButton;
        public RadioButton myDeleteButton;
        public TextBox mySource;
        public ComboBox myDestinations;

        private FolderBrowserDialog sourceFolder;
        private FolderBrowserDialog destFolder;

        public void InitialisePicture()
        {

            if (arrayPictures != null && arrayPictures.Length > 0)
            {
                myPictureBox.ImageLocation = arrayPictures[arrayPosition, 0];
            }
            else
            {
                MessageBox.Show("The folder you have selected contains no pictures...");
                myPictureBox.ImageLocation = null;
            }
        }

        public void NavigatePicture(int direction)
        {

            if (arrayPosition + direction >= 0 && arrayPosition + direction < numFiles)
            {
                arrayPosition += direction;
                myPictureBox.ImageLocation = arrayPictures[arrayPosition, 0];


                myCopyButton.Checked = Convert.ToBoolean(arrayPictures[arrayPosition, 1]);
                myDeleteButton.Checked = Convert.ToBoolean(arrayPictures[arrayPosition, 2]);

            }
        }

        public void UpdateActions(bool copyChecked, bool deleteChecked)
        {
            if (arrayPictures != null)
            {
                arrayPictures[arrayPosition, 1] = copyChecked.ToString();
                arrayPictures[arrayPosition, 2] = deleteChecked.ToString();
            }

        }


        public void GetFiles()
        {

            sourceFolder = new FolderBrowserDialog();
            sourceFolder.ShowDialog();

            if (sourceFolder.SelectedPath != "")
            {
                string[] arrayTempFiles = Directory.GetFiles(sourceFolder.SelectedPath,"*.jpg");
                numFiles = arrayTempFiles.Length;

                arrayPictures = new string[arrayTempFiles.Length,3];

                for (int i = 0; i < arrayTempFiles.Length; i++)
                {
                    arrayPictures[i, 0] = arrayTempFiles[i];
                    arrayPictures[i, 1] = "false";
                    arrayPictures[i, 2] = "false";
                }

                mySource.Text = sourceFolder.SelectedPath;

                InitialisePicture();
            }

        }

        public void AddDestinationFolder()
        {
            destFolder = new FolderBrowserDialog();
            destFolder.ShowDialog();

            if (destFolder.SelectedPath != "")
            {
                myDestinations.Items.Add(destFolder.SelectedPath);
            }

        }





    }
}

Form1.cs的

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace PictureController
{

    public partial class Form1 : Form
    {

        PictureController PicControl;

        public Form1()
        {
            InitializeComponent();

            PicControl = new PictureController() { myPictureBox = pbPhoto, myCopyButton = rbMove, myDeleteButton = rbDelete, mySource = tbSource, myDestinations = cbDestination };
        }

        private void btnPrev_Click(object sender, EventArgs e)
        {
            PicControl.NavigatePicture(-1);
        }

        private void btnNext_Click(object sender, EventArgs e)
        {
            PicControl.NavigatePicture(1);
        }

        private void rbMove_CheckedChanged(object sender, EventArgs e)
        {
            if (rbMove.Checked || rbDelete.Checked)
            {
                PicControl.UpdateActions(rbMove.Checked, rbDelete.Checked);
            }
        }

        private void rbDelete_CheckedChanged(object sender, EventArgs e)
        {
            if (rbMove.Checked || rbDelete.Checked)
            {
                PicControl.UpdateActions(rbMove.Checked, rbDelete.Checked);
            }
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.A:
                    PicControl.NavigatePicture(-1);
                    break;
                case Keys.D:
                    PicControl.NavigatePicture(1);
                    break;
                case Keys.W:
                    rbMove.Checked = true;
                    break;
                case Keys.S:
                    rbDelete.Checked = true;
                    break;
            }


        }

        private void btnGetFiles_Click(object sender, EventArgs e)
        {
            PicControl.GetFiles();
        }

        private void btnProcess_Click(object sender, EventArgs e)
        {


        }

        private void btnAddDest_Click(object sender, EventArgs e)
        {
            PicControl.AddDestinationFolder();
        }

    }
}

4 个答案:

答案 0 :(得分:2)

我没有在PictureController课程中看到使用控件的原因。您应该只在那里使用非表单数据类型并处理Form中的交互,从PictureController类提供事件和方法以对其作出反应并采取行动。

答案 1 :(得分:1)

在我看来,这是一个良好的开端。

很难判断你是否做了“错误”的事情,因为这取决于认为是对的,每个程序员都有他/她自己的风格和最佳实践集,只要代码是工作和效率它是“正确的”。有许多通往罗马的道路。 :)

无论如何,如果你要求个人意见或建议,我会在逻辑上做两个重大改变:

  1. 让Controller成为静态类(如果您愿意,可以使用Singleton)
  2. 不要直接传递或使用表单控件。而是将表单实例传递给某些Initialize方法中的静态类,然后使用该实例并调用直接使用控件的公共方法。
  3. 第二次更改的示例:

    public static void NavigatePicture(int direction)
    {
        if (arrayPosition + direction >= 0 && arrayPosition + direction < numFiles)
        {
            arrayPosition += direction;
            _formInstance.SetPictureLocation(arrayPictures[arrayPosition, 0]);
    
            _formInstance.SetCopyStatus(Convert.ToBoolean(arrayPictures[arrayPosition, 1]));
            _formInstance.SetDeleteStatus(Convert.ToBoolean(arrayPictures[arrayPosition, 2]));
        }
    }
    
    
    //...and in the form:
    public SetPictureLocation(sLocation)
    {
        myPictureBox.ImageLocation = sLocation;
    }
    

答案 2 :(得分:0)

拥有控制器有什么意义,只是将额外的逻辑封装在表单之外?你需要你的控制器是可测试的吗?您想使用业务逻辑的抽象模型吗?如果您对最后2个问题的回答为“是”,则可能需要谷歌:

一个。 MVC模式 湾MVP模式

答案 3 :(得分:0)

一切都错了。

控制器(如果它是表格/窗口的控制器)应该在您的样本中了解表格 - 形式了解控制器。

当你的样本控制器中有对pict​​ureBox'es等的引用时,控制器应该知道如何构建数据/并处理一些表单事件。

并且不需要从控制代码中“提取”控制器,而没有建立控件的“数据/模型”(并且没有框架类型)。

目前尚不清楚那里有什么数据:路径或图像采集。