页面对象设计 - 当页面因用户而异时
Page Object Design - when page is different depending on user
我想知道什么是解决我遇到的问题的最佳设计
我的应用程序中有一个页面,在该页面上显示了一个表单,用户可以在其中输入数据。根据登录用户的类型,将有一些常见的文本框、下拉列表等和一些用户特定的输入数据字段。
因此,例如,对于内部用户,将显示所有输入字段,而对于外部用户,将仅显示有限的输入字段。
问题是应该根据用户显示 4-5 种不同的形式
目前我有一个基页,表单页继承了页页
public class BasePage
{
PageFactory.InitElements(); etc.
}
Public class FormPage : Base Page
{
// All elements and methods for all types of forms
}
这是我不确定最佳方法的地方
我应该为每个表单类型创建单独的 类 并继承 FormPage 吗?
我在下面添加了一个示例,但我的应用程序非常复杂,但它应该能让您对设计有所了解
public class FormInternalUser : Form Page
{
public void SubmitFormAction(string inputTextBox1, string inputTextBox2, string inputTextBox3, string inputTextBox4, string user)
{
// code
attachFile(user)
}
public override void attachFile(string user)
{
//code
}
// other specific methods
}
public class FormExternalUser : Form Page
{
public void SubmitFormAction(string inputTextBox1, string inputTextBox2, string user)
{
// code
attachFile(user)
}
public override void attachFile(string user)
{
// code
}
// other specific methods
}
或者有更好的方法吗?也许是策略设计模式或类似的东西?
我想您当前在页面上的表单应该取决于 UserType,因此例如它可以是:
// type of users
public enum UserType {
Type1,
Type2,
Type3
}
// the page from which you will be input the data
public class MainPage {
public IUserDataForm UserDataFormComponent => GetUserDataForm();
// factory method to get the certain form depends on user type
private IUserDataForm GetUserDataForm() {
UserType userType = UserType.Type1; // get a value from somewhere (or pass it into constructor e.g.)
switch(userType) {
case Type1: return new User1DataForm(); break;
case Type2: return new User2DataForm(); break;
case Type3: return new User3DataForm(); break;
}
}
}
// user data class to pass the class instead count of variables the methods
public class UserData {
string Text1;
string Text2;
string TextN;
}
// input data page interface
public interface IUserDateForm {
void FillUserData(UserData data);
}
// base page for input data pages - needs if we have duplicated logic in the all other pages (could be removed if not)
public abstract UserDateForm :IUserDateForm{
// common locators, etc.
public override void FillUserData(UserData data) {
// common input logic
}
}
// implementation of
public class User1DateForm : UserDateForm {
public override void FillUserData(UserData data) {
base().FillUserData(data);
// input logic
}
}
public class User2DateForm : UserDateForm {
public override void FillUserData(UserData data) {
base().FillUserData(data);
// input logic
}
}
public class User3DateForm : UserDateForm {
public override void FillUserData(UserData data) {
base().FillUserData(data);
// input logic
}
}
使用方法:
public void Test1 {
UserData data = new UserData() { Text1 = "", Text2 = "", TextN = "" };
MainPage main = new MainPage();
main.UserDataFormComponent.FillUserData(data);
}
我想知道什么是解决我遇到的问题的最佳设计
我的应用程序中有一个页面,在该页面上显示了一个表单,用户可以在其中输入数据。根据登录用户的类型,将有一些常见的文本框、下拉列表等和一些用户特定的输入数据字段。
因此,例如,对于内部用户,将显示所有输入字段,而对于外部用户,将仅显示有限的输入字段。
问题是应该根据用户显示 4-5 种不同的形式
目前我有一个基页,表单页继承了页页
public class BasePage
{
PageFactory.InitElements(); etc.
}
Public class FormPage : Base Page
{
// All elements and methods for all types of forms
}
这是我不确定最佳方法的地方
我应该为每个表单类型创建单独的 类 并继承 FormPage 吗?
我在下面添加了一个示例,但我的应用程序非常复杂,但它应该能让您对设计有所了解
public class FormInternalUser : Form Page
{
public void SubmitFormAction(string inputTextBox1, string inputTextBox2, string inputTextBox3, string inputTextBox4, string user)
{
// code
attachFile(user)
}
public override void attachFile(string user)
{
//code
}
// other specific methods
}
public class FormExternalUser : Form Page
{
public void SubmitFormAction(string inputTextBox1, string inputTextBox2, string user)
{
// code
attachFile(user)
}
public override void attachFile(string user)
{
// code
}
// other specific methods
}
或者有更好的方法吗?也许是策略设计模式或类似的东西?
我想您当前在页面上的表单应该取决于 UserType,因此例如它可以是:
// type of users
public enum UserType {
Type1,
Type2,
Type3
}
// the page from which you will be input the data
public class MainPage {
public IUserDataForm UserDataFormComponent => GetUserDataForm();
// factory method to get the certain form depends on user type
private IUserDataForm GetUserDataForm() {
UserType userType = UserType.Type1; // get a value from somewhere (or pass it into constructor e.g.)
switch(userType) {
case Type1: return new User1DataForm(); break;
case Type2: return new User2DataForm(); break;
case Type3: return new User3DataForm(); break;
}
}
}
// user data class to pass the class instead count of variables the methods
public class UserData {
string Text1;
string Text2;
string TextN;
}
// input data page interface
public interface IUserDateForm {
void FillUserData(UserData data);
}
// base page for input data pages - needs if we have duplicated logic in the all other pages (could be removed if not)
public abstract UserDateForm :IUserDateForm{
// common locators, etc.
public override void FillUserData(UserData data) {
// common input logic
}
}
// implementation of
public class User1DateForm : UserDateForm {
public override void FillUserData(UserData data) {
base().FillUserData(data);
// input logic
}
}
public class User2DateForm : UserDateForm {
public override void FillUserData(UserData data) {
base().FillUserData(data);
// input logic
}
}
public class User3DateForm : UserDateForm {
public override void FillUserData(UserData data) {
base().FillUserData(data);
// input logic
}
}
使用方法:
public void Test1 {
UserData data = new UserData() { Text1 = "", Text2 = "", TextN = "" };
MainPage main = new MainPage();
main.UserDataFormComponent.FillUserData(data);
}