Estoy tratando de utilizar el modelo de objetos de página para mis pruebas y estoy tratando de estructurar mis clases de página para poder hacer un "constructor de patrón-como" estructura (no he visto muy a menudo, así que no hago saber si tiene un nombre o si es incluso una cosa) como en este ejemplo:
public class Page1 implements Page {
public static Page1 goOn(){
return new Page1();
}
public Page1 action1() {
return this;
}
public Page2 gotoPage2() {
return new Page2();
}
}
public class Page2 implements Page {
public Page2 action2() {
return this;
}
public Page2 gotoPage1() {
return new Page2();
}
}
Y luego usarlo como:
Page1.goOn()
.action1()
.gotoPage2() //it return a Page2 object which mean you cant use Page1 methods anymore
.action2() // avoiding using the Page1 object which wouldnt be usable anymore if we stored it
.goToPage1() //and poof we can only use Page1 methods again
.action1()
//etc...
Así es cómo me las arreglaría "lineal" cambio de página, que permite algunas buenas cosas con auto-completado y te obliga a hacer solamente acciones válidas antes de tiempo de compilación (que creo que es genial, ya que odio los errores de ejecución> :()
Entonces estoy tratando de manejar una página de login (su mayor parte un simple ejemplo de lo que voy a tener que hacer a continuación), hay 2 salidas diferentes posibles dependiendo de si el inicio de sesión falla o no. En este caso específico que podría haber hecho 2 funciones: public Page1 logIn(){...}
y public Page2 "logInButFail(){...}
, pero por varias razones me gustaría hacer algo como:
public Page logIn(User user) {
//do the login in the page
//IF login worked:
//return new Page2();
//ELSE
//return this; // or new Page1(),
}
El problema es, para seguir adelante con los métodos que encadenar cosita que tenía antes de que tenga que hacer moldes inseguras, que ... puedo manejarlos bastante bien y con seguridad pero significa regla sagrada de java de ruptura sobre la escritura ... Y así, El cerebro de mi abanico de tipos estáticos lil' ha estado luchando para decidir qué hacer.
Entonces:
- ¿Hay una manera de hacerlo sin hacer moldes inseguras?
- Si no es así, habría de hacerlo:
- Hacer un código eficiente utilizando moldes inseguros (que en realidad son bien porque si esos moldes fallan Eso significa que la prueba ha fallado antes)?
- Hacer menos eficiente código java, pero mantener feliz? :)
Gracias por cualquier ayuda sobre el tema, si necesita más explicación me pregunta voy a hacer mi mejor esfuerzo para explicar con más precisión (también si se sabe cómo esta práctica se llama Me interesa) :)
EDIT: después de usar la dinámica logIn()
utilizo la siguiente función de hacer valer el tipo de la página (aquí es donde tengo que hacer el reparto insegura Trato de evitar):
public <T extends Page> T assertPage(Class<T> type){
boolean isgood = (this.getClass.equals(type));
assertTrue(isgood);
if(isgood){
return (T)this; //this is the unsafe cast im trying to avoid
}else{
//throw an exception as this is not supposed to happen
}
}
Por lo tanto, desea método de página a objetos, cosa que va a volver conditionaly instancia de la Página 1 Página 2 o. Para ello, ha creado el método del tipo de página. Y desea ejecutar este método y continuará trabajando con instancia de la Página 1 Página 2 o depende de la condición sin el molde. ¿Derecho? Puede hacerlo a través de los genéricos. Aquí es ejemplo simplificado:
class Page{
<T extends Page> T conditionalAction( T pageObject ){
return pageObject;
}
}
class Page1 extends Page{
Page1 action1(){ return this; }
}
class Page2 extends Page{
Page2 action2(){ return this; }
}
Ahora, usted puede hacer algo como:
Page1 page1 = new Page1();
Page2 page2 = new Page2();
page1.action1()
.conditionalAction( page1 )
.action1()
.conditionalAction( page2 )
.action2();
Usted es libre de utilizar tal método de cualquier tipo de retorno genéricos en su padre / clase clild.
Y si quieres sólo para afirmar la clase que se obtiene de un método, que puede hacer el registro de entrada:
public Page conditionalAction( boolean condition ) {
if ( condition ) {
return new Page1();
} else {
return new Page2();
}
}
// en la prueba
Page result = new Page1().conditionalAction( true );
if ( result instanceof Page1 ){
Page1 page1 = (Page1) result;
} else if ( result instanceof Page2 ){
Page2 page2 = (Page2) result;
}