Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 用户登录的UML类图_Design Patterns_Oop_Class Design_Uml - Fatal编程技术网

Design patterns 用户登录的UML类图

Design patterns 用户登录的UML类图,design-patterns,oop,class-design,uml,Design Patterns,Oop,Class Design,Uml,下面的图表是我第一次尝试创建一个UML类图来描述用户登录网站的情况 我相信这是一个糟糕的设计,充满了缺陷,但我希望能从你们那里学到如何设计这样一个简单的登录。我特别感兴趣的是您对设计模式的使用,以及您将使用哪些模式,您将如何在设计中实现它,以及为什么 任何建议、批评、评论和建议都将不胜感激。提前谢谢。我想换两个地方: 1) 数据库不是类,不应显示在类图表中。这可能是用户帐户的实际情况(据我所知,它是数据库中的一个表) 2) 当3个类从1个超类(网站管理员、版主、来自用户的RegularMemb

下面的图表是我第一次尝试创建一个UML类图来描述用户登录网站的情况

我相信这是一个糟糕的设计,充满了缺陷,但我希望能从你们那里学到如何设计这样一个简单的登录。我特别感兴趣的是您对设计模式的使用,以及您将使用哪些模式,您将如何在设计中实现它,以及为什么


任何建议、批评、评论和建议都将不胜感激。提前谢谢。

我想换两个地方:

1) 数据库不是类,不应显示在类图表中。这可能是用户帐户的实际情况(据我所知,它是数据库中的一个表)

2) 当3个类从1个超类(网站管理员、版主、来自用户的RegularMember)继承时,它也如我画的如下所示:

                 1     uses>   1..*
          User <>--------------->UserAccount
           /|\
            |
            |
     _______|________
     |      |       |
     |      |       |
   Mod     WebM   RegularM
1使用>1*
用户----------------->UserAccount
/|\
|
|
_______|________
|      |       |
|      |       |
Mod WebM RegularM

下面是我们如何实现此功能的



正如您所见,我们有许多应用程序(在这里,它的行为类似于您的网站)

版主、网站管理员和会员,如您的地图所示,作为一个角色会更好。无论您是否需要添加新的“角色”,都会发生什么。也许你必须改变你所有的模型

每个用户应用程序(用户网站)都有其开始和结束日期。每个应用程序都有自己的角色。银行网站需要一个经理角色。健康保险公司网站需要代理角色等等

更新

我理解登录/用户(部分/全部)组成关系。在继续之前,请参阅这篇关于组合与聚合的文章

但我不理解的是UserApplication和Application类的用途

把应用程序想象成你的网站。我在一家大型健康保险公司工作,我们有很多模块(每个模块(应用程序)都有自己的网站)。但并非所有用户都可以使用每个模块。它解释了我为什么定义UserApplication

角色在此登录过程中的角色

没有。它只是给用户应用程序一个角色。我可以使用财务模块,它定义了以下角色:经理、客户和其他,在这里我可以扮演经理的角色。但是我可以为您指定一个临时用户(startDate和endDate)作为客户来使用财务模块

Application financialModule = new Application();

financialModule.addRole(new Role("Manager"));
financialModule.addRole(new Role("Customer"));
financialModule.addRole(new Role("Other"));

User arthur = new User(new Login("#####", "#####"));
arthur.setFirstName("Arthur");
arthur.setLastName("Ronald");
arthur.setEnabled(true);

UserApplication financialModuleUser = new UserApplication(new Period(new Date(), null));
financialModuleUser.setUser(arthur);
financialModuleUser.addRole(financialModule.getRoleByDescription("Manager"));

financialModule.addUserApplication(financialModuleUser);
你的网站看起来像

Website myWebsite = new Website();
myWebsite.addRole(new Role("Member"));
myWebsite.addRole(new Role("WebMaster"));
myWebsite.addRole(new Role("Moderator"));

User you = new User(new Login("#####", "#####"));
you.setFirstName("FirstName");
you.setLastName("LastName");
you.setEnabled(true);

UserApplication myWebsiteUser = new UserApplication(new Period(new Date(), null));
myWebsiteUser.setUser(you);
myWebsiteUser.addRole(myWebsite.getRoleByDescription("WebMaster"));

myWebsite.addUserApplication(myWebsiteUser);
如您所见,网站管理员、版主和会员都是您网站定义的角色。没有别的了


关于UML和ORM的一个很好的资源是《Java持久化与Hibernate》一书。

我建议您使用GRAP设计模式进行良好的设计。根据这一原则,首先您应该考虑谁负责进行此操作。哪个类负责,或者哪个方法负责。总之,您还将看到Gof模式的根源是抓取。 在您的设计中,很抱歉,我遗憾地说您的用例没有得到很好的定义,这个类图应该是您的领域模型,因为它反映了您用例中的概念。我反对在绘制所谓用例的系统序列和交互图之前先绘制类图。在您的域模型中,常规成员、web管理员和版主是一个用户,我们可以说是使用用户帐户。顺便说一句,只要不应该继承,就不要进行继承,因为它会增加类的耦合,所以不能进行现成的重构。


我检查了您的用例描述,它是错误的,可能是:

Use Case: Login The System
Scope: Your Project Name.
Primary Actor: User
StakeHolders and Interests:
User: want to sign-in the system without any mistake or error.
Preconditions: User should be the system user
Success Guarantee: User entered the system
Main Success Scenario:
1.  User enters login page.
2.  System builds login page. Fields such as username and password  are observed on the screen.
3.  Users enters required informations.
4.  Users sends information with a view to entering the system.
5.  System approves information, open the session of user and returns message ”Login process is successfull”.
Alternate flows:
      3a.User does not enter all required field.
              1.System wait that user enter so-called required field.
       4a.The information of user such as username or password is wrong
              1.System send message ”Your send wrong user parameters.”
在您编写用例之后,您可以这样绘制SSD

前面提到的SSD的交互图是这样的。我假设您使用ORM(如Hibernate、LinqToSql、EntityFramework…所以在访问数据时不需要facade模式)

伙计,你不能从一个用例中决定其他用户。所以Larman说这个组是我们的用例,并选择了一个组进行实现。此用例组反映了版本1中的类。所以一个用例不能获得很多类。读一下拉曼斯的书,看看这些演示文稿


如果将责任分配给类,那么实现将非常容易。也许你不喜欢读书,但有时我们应该读一些书。拉曼斯的书是软件工程师最喜欢的书之一。许多大学都使用这本书进行面向对象的分析和设计。

Opps,我应该让网络管理员从版主那里继承,这样我就不必重写删除注册成员函数了。谢谢你的回复。是的,我知道我不应该把与数据库对话的类命名为“数据库”。我应该说得更清楚些。那么,如何验证用户的登录凭据呢?我打算将这些凭据存储在数据库中,然后让一个类与数据库通信,并用数据库中存储的内容验证登录。@Roman,是的,我现在看到了,User(可能是抽象类)与UserAccount和超级类(Mod、WebM和RegularM)有聚合关系所有这些都从用户那里继承了这种关系。+1,谢谢Arthur,感谢您花时间向我展示您如何实际实现登录,我非常感谢。这很有帮助。好的,所以我理解了登录/用户(部分/全部)组成关系。但我不明白的是UserApplication和Application类的用途。我看到每个用户都使用一个UserApplication,我想一个应用程序可以生成一个或多个UserApplication,但是你能给我一个UserApplication的例子吗。还有,这个角色在这个登录过程中的角色,我不太确定这个类在用户中扮演什么角色。@Arthur,你能推荐一些专注于使用UML设计代码的论坛吗?@Arthur Garcia,再次感谢你抽出时间来体验