C# 设计应用程序类

C# 设计应用程序类,c#,design-patterns,architecture,C#,Design Patterns,Architecture,除了使用单一责任原则外,在为正在编写的应用程序设计类时,还应该记住什么,以保持代码的可维护性、可重用性并遵守OOP原则 我发现很难设计我试图编写的应用程序的类,因为什么时候才能决定什么(功能)放在哪个类中,以及它是否真的应该放在派生类中,或者这个类应该有一个抽象类或接口 我知道这可能是一个有很多答案的主题,但是有没有人有好的指导方针(最好是简单的)来设计易于维护并且在创建大型应用程序时不会造成混乱的类和类层次结构 编辑: 当类有10个以上的方法,并且有一个抽象的基类&它派生的接口时。还有3个在类

除了使用单一责任原则外,在为正在编写的应用程序设计类时,还应该记住什么,以保持代码的可维护性、可重用性并遵守OOP原则

我发现很难设计我试图编写的应用程序的类,因为什么时候才能决定什么(功能)放在哪个类中,以及它是否真的应该放在派生类中,或者这个类应该有一个抽象类或接口

我知道这可能是一个有很多答案的主题,但是有没有人有好的指导方针(最好是简单的)来设计易于维护并且在创建大型应用程序时不会造成混乱的类和类层次结构

编辑:

当类有10个以上的方法,并且有一个抽象的基类&它派生的接口时。还有3个在类内全局引用的单例类以及更多。听起来它需要一些“重构”应用

对不起,如果这是一个很长的例子,但你看到了我面临的问题,我需要一些投入。请只看设计,而不是技术细节

我举一个例子:

我创建了这个类:(不久前)

类ExistingUserLogon:Logon,ILogonUser
{
#区域成员变量
LogonEventArgs _LogonEventArgs;
洛甘达尔甘达;
Factory f=Factory.FactoryInstance;
PasswordEncrypt.Collections.AppLoginDataCollection AppLoginDataCollection;
PasswordEncrypt.Collections.SQlLoginDataCollection SQlLoginDataCollection;
比较;
静态ExistingUserLogon ExistingUserLogon;
PasswordEncrypt.SQLDatabase.DatabaseLogin dblogin;
string databasename=string.Empty;
#端区
#区域属性
公共静态ExistingUserLogon ExistingUserLogonInstance
{
得到
{
如果(existinguserlogon==null)
existinguserlogon=新existinguserlogon();
返回existinguserlogon;
}
}
公共字符串登录名
{
得到;
设置
}
#端区
#区域构造函数
公共ExistingUserLogon(bool?比较,LogonData LogonData)
{
这个比较=比较;
this.lgnda=logonda;
this.applogindatacollection=f.applogindatacollection;
this.sqllogindacollection=f.sqllogindacollection;
}
public ExistingUserLogon()
{
this.applogindatacollection=f.applogindatacollection;
this.sqllogindacollection=f.sqllogindacollection;
}
#端区
#区域代表
公共委托void ConnStrCreated(对象发送方,logonventargs e);
#端区
#地区活动
公共事件连接已创建连接字符串已创建;
#端区
已创建连接字符串上的专用void(对象发送方,LogonEventArgs e)
{
if(ConnectionStringCreated!=null)
{
连接字符串已创建(发送方,e);
}
}
public void LoginNewUser()
{
dblogin=new PasswordEncrypt.SQLDatabase.DatabaseLogin();
如果(!string.IsNullOrEmpty(loginname))
{
字符串temp=dblogin.GenerateDBUserName(loginname);
如果(温度!=“已存在”)
{
如果(比较==真)
{
迭代收集(lgnda.HahsedUserName.HashedUserName,新操作(OnDatabaseName));
迭代收集(临时、新操作(成功));
}
}
}
其他的
{
LogonEventArgs e=新LogonEventArgs();
e、 成功=错误;
e、 ErrorMessage=“错误!没有用户名”;
OnError(本,e);
}
}
私有void OnDatabaseName(字符串名称)
{
this.databasename=名称;
}
私有成功(bool成功、字符串psw、字符串userid)
{
如果(成功)
{
//创建连接字符串
ConnectionStringCreator cnstrCreate=ConnectionStringCreator.ConnectionStringInstance;
if(databasename!=string.Empty)
{
string conn=ConnectionStringCreator.CreateConnString(数据库名、用户ID、psw);
bool数据库存在;
databaseExists=DataManagementVerification.DoDatabaseExists(conn);
如果(数据库存在)
{
FormsTransfer.ConnectionString=conn;
conn=string.Empty;
}
其他的
{
LogonEventArgs e=新LogonEventArgs();
e、 成功=错误;
e、 ErrorMessage=“数据库不存在!”;
OnError(本,e);
}
//OnConnectionStringCreated(此,e);
//PasswordEncrypt.LINQtoSQL.PasswordDatabase db=new PasswordEncrypt.LINQtoSQL.PasswordDatabase(conn);
/*PasswordEncrypt.LINQtoSQL.EncryptData _EncryptData=new PasswordEncrypt.LINQtoSQL.EncryptData()
{
加密ID=1,
IV=“测试”,
PrivateKey=“你好”,
PublicKey=“托尼”
};
db.EncryptionData.InsertOnSubmit(_encryptdata);
//db.SubmitChanges()*/
//PasswordEncrypt.LINQtoSQL.Data _Data=new PasswordEncrypt.LINQtoSQL.Data()
/
  class ExistingUserLogon : Logon, ILogonUser
    {
        #region Member Variables

        LogonEventArgs _logoneventargs;
        LogonData lgndata;
        Factory f = Factory.FactoryInstance;
        PasswordEncrypt.Collections.AppLoginDataCollection applogindatacollection;
        PasswordEncrypt.Collections.SQlLoginDataCollection sqllogindatacollection;
        bool? compare;
        static ExistingUserLogon existinguserlogon;
        PasswordEncrypt.SQLDatabase.DatabaseLogin dblogin;
        string databasename = string.Empty;

        #endregion

        #region Properties

        public static ExistingUserLogon ExistingUserLogonInstance
        {
            get
            {
                if (existinguserlogon == null)
                    existinguserlogon = new ExistingUserLogon();
                return existinguserlogon;
            }
        }
        public string loginname
        {
            get;
            set;
        }
        #endregion

        #region Contructors
        public ExistingUserLogon(bool? compare, LogonData logondata)
        {
            this.compare = compare;
            this.lgndata = logondata;
            this.applogindatacollection = f.AppLoginDataCollection;
            this.sqllogindatacollection = f.SqlLoginDataCollection;
        }

        public ExistingUserLogon()
        {
            this.applogindatacollection = f.AppLoginDataCollection;
            this.sqllogindatacollection = f.SqlLoginDataCollection;
        }

        #endregion

        #region Delegates

        public delegate void ConnStrCreated( object sender, LogonEventArgs e );

        #endregion

        #region Events

        public event ConnStrCreated ConnectionStringCreated;

        #endregion

        private void OnConnectionStringCreated( object sender, LogonEventArgs e )
        {
            if (ConnectionStringCreated != null)
            {
                ConnectionStringCreated(sender, e);
            }
        }

        public void LoginNewUser()
        {
            dblogin = new PasswordEncrypt.SQLDatabase.DatabaseLogin();
            if (!string.IsNullOrEmpty(loginname))
            {
                string temp = dblogin.GenerateDBUserName(loginname);
                if (temp != "Already Exists")
                {

                    if (compare == true)
                    {
                        IterateCollection(lgndata.HahsedUserName.HashedUserName, new Action<string>(OnDatabaseName));
                        IterateCollection(temp, new Action<bool, string, string>(OnIterateSuccess));
                    }
                }

            }
            else
            {
                LogonEventArgs e = new LogonEventArgs();
                e.Success = false;
                e.ErrorMessage = "Error! No Username";
                OnError(this, e);

            }

        }

        private void OnDatabaseName(string name)
        {
            this.databasename = name;
        }

        private void OnIterateSuccess( bool succeed, string psw, string userid )
        {
            if (succeed)
            {
                // Create connectionstring
                ConnectionStringCreator cnstrCreate = ConnectionStringCreator.ConnectionStringInstance;
                if (databasename != string.Empty)
                {
                    string conn = ConnectionStringCreator.CreateConnString(databasename, userid, psw);
                    bool databaseExists;

                    databaseExists = DataManagementVerification.DoDatabaseExists(conn);

                    if (databaseExists)
                    {
                        FormsTransfer.ConnectionString = conn;

                        conn = string.Empty;
                    }
                    else
                    {
                        LogonEventArgs e = new LogonEventArgs();
                        e.Success = false;
                        e.ErrorMessage = "Database does not Exist!";
                        OnError(this, e);
                    }

                    //OnConnectionStringCreated(this, e);

                   // PasswordEncrypt.LINQtoSQL.PasswordDatabase db = new PasswordEncrypt.LINQtoSQL.PasswordDatabase(conn);

                /*    PasswordEncrypt.LINQtoSQL.EncryptData _encryptdata = new PasswordEncrypt.LINQtoSQL.EncryptData()
                    {
                        EncryptID = 1,
                        IV = "Test",
                        PrivateKey = "Hello",
                        PublicKey = "Tony"
                    };

                    db.EncryptionData.InsertOnSubmit(_encryptdata);

                   // db.SubmitChanges();*/

                    //PasswordEncrypt.LINQtoSQL.Data _data = new PasswordEncrypt.LINQtoSQL.Data()
                    //{
                    //    EncryptionID = 1,
                    //    Username = "Tbone",
                    //    Password = "worstje",
                    //    IDCol = 2
                    //};

                    //db.Data.InsertOnSubmit(_data);

                    //db.SubmitChanges();

                    //IEnumerable<PasswordEncrypt.LINQtoSQL.Data> _ddata = db.Data.Where(data => data.Password == "worstje"); ;
                    //foreach (PasswordEncrypt.LINQtoSQL.Data data in _ddata)
                    //{

                    //    MessageBox.Show("Data Found: " + data.Username + "," + data.Password);
                    //}
                }
                else
                {
                    MessageBox.Show("Found no Database name", "Database name error");
                }
            }
            else
            {
                // Unable to create connectionstring
            }
        }

        private void IterateCollection( string username, Action<bool, string, string> OnSucceed )
        {
            bool succeed = false;
            dblogin = new PasswordEncrypt.SQLDatabase.DatabaseLogin();

            string psw;
            string userid;

            foreach (KeyValuePair<PasswordEncrypt.Collections.GItem<string>, PasswordEncrypt.Collections.GItem<string>> kv in sqllogindatacollection)
            {
                List<char> tempa = new List<char>();
                List<char> tempb = new List<char>();

                tempa = dblogin.GetNumber(username);
                tempb = dblogin.GetNumber(kv.Key.Item);

                if (tempa.Count == tempb.Count)
                {
                    for (int i = 0; i < tempa.Count ; i++)
                    {
                        if (tempa.ElementAt(i).Equals(tempb.ElementAt(i)))
                        {
                            if ( i == (tempa.Count -1) )
                                succeed = true;
                            continue;
                        }
                        else
                        {
                            KeyValuePair<PasswordEncrypt.Collections.GItem<string>, PasswordEncrypt.Collections.GItem<string>> last =  sqllogindatacollection.Last();
                            if (kv.Key.Item.Equals(last.Key.Item))
                            {
                                MessageBox.Show("Failed to match usernames for Database", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                                succeed = false;
                                // Let GUI Know...
                                LogonEventArgs e = new LogonEventArgs();
                                e.Success = succeed;
                                OnError(this, e);
                                break;
                            }
                            else
                            {
                                break;
                            }

                        }

                    }


                   // MessageBox.Show("Found a sql username match");
                }
                // Now go execute method to logon into database...
                if (succeed)
                {
                    psw = kv.Value.Item;
                    userid = kv.Key.Item;
                    OnSucceed(succeed, psw, userid);
                }
                succeed = false;
            }


        }

        private void IterateCollection(string key, Action<string> OnDatabaseName )
        {
            foreach (KeyValuePair<PasswordEncrypt.Collections.GItem<string>, PasswordEncrypt.Collections.GItem<string>> kv in applogindatacollection)
            {
                if (key == kv.Key.Item)
                {
                    MessageBox.Show("Found a match");
                    OnDatabaseName(kv.Value.Item);
                }
                else
                {
                   // MessageBox.Show("No Match");
                }
            }
        }

        #region Public Methods

        public bool? ReadFromRegistry( HashedUsername username, HashedPassword hashedpassword )
        {
            return RegistryEdit.ReadFromRegistry(username, hashedpassword);
        }

        public bool WriteToRegistry( HashedUsername username, HashedPassword hashedpassword )
        {
            return RegistryEdit.WriteToRegistry(username, hashedpassword);
        }

        public override void Login(TextBox username, TextBox password)
        {
            base.Login(username, password);
            Login(username.Text, password.Text);
        }

        protected override void Login(string username, string password)
        {
            base.Login(username, password);
            lgndata = base._logondata;
            compare = base._regRead;

            if (compare == true)
            {
                loginname = username;
                LoginNewUser();
                /// on login succeeded let UI class know
                _logoneventargs = new LogonEventArgs();
                _logoneventargs.Success = true;

                OnExistingUserLoggedIn(this, _logoneventargs);
            }
            else
            {
                _logoneventargs = new LogonEventArgs();
                _logoneventargs.Success = false;
                _logoneventargs.ErrorMessage = "Cannot Login this user, please try again.";
                OnError(this, _logoneventargs);
            }
            /// Get username and password for database... 
            /// to login using correct user data & permissions
            /// Login data for database is generated at runtime
            /// then by checking if database with such a name exists
            /// login...

        }
        #endregion
    }
private interface IPerformWork
{
    void DoThis(String value);
    void DoThat(String value);  
}