Spanish Como organizar el código

angel_

Well-Known Member
Licensed User
Longtime User
Utilizo con frecuencia ASViewPager, ASTabStrip, etc. con lo que acabo metiendo 3-4 activities (o pages) en el mismo 'Activity module', esto hace que ese activity tenga muchas líneas y algo más en proyectos multiplataforma, había pensado en separar los eventos y la carga de los activities del resto del código pero no ha sido posible al tener declaraciones de views en activities que no cargan ningún diseño (se cargarían en el activity que tiene los eventos), así que lo que hago es utilizar #Region... todo en un mismo activity.

Tenéis problemas similares, ¿Cómo los abordais?
 
Last edited:

TheFalcon

Active Member
Licensed User
Longtime User
yo hoy por hoy sigo usando region, lo uso en Visual basic y lo uso aquí, no conozco metodo mejor :) , al menos aqui las tabulaciones para organizar If´s etc te las respeta
 

josejad

Expert
Licensed User
Longtime User
Hola Ángel:

Precisamente me pasa igual en cuanto empiezo a hacer una pequeña app un poco más grande.
Estoy convencido de que la mejor forma es trabajar con clases, pero es cierto que, en cuanto tengo que inicializar vistas, o llamar a diferentes métodos, al final empiezo a liarme con qué debería estar en la clase y qué en la propia actividad, a pesar de haber leído alguna vez de Erel, que lo ideal es que en la actividad esté sólo el código referente a la interfaz (UI) y separado en la clase digamos que toda la lógica.
Sigo sin conseguirlo.

De hecho, vi una vez un proyecto de rraswizak, y pensé: "puf, así me gustaría a mí tener organizadas las cosas".

Escribí algo de eso en este post, y puedes ver los pantallazos del proyecto a los que me refiero en el enlace de la frase: "But when I saw this screen from this post"
 

angel_

Well-Known Member
Licensed User
Longtime User
He pensado en separar la declaración de views y eventos del resto del código de la siguiente forma:

Aquí cargo el layout, declaro las variables y lanzo los eventos:
Layout:
'This event will be called once, before the page becomes visible.
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
  
    Private Button1 As B4XView
    Private lblNumero1 As B4XView
    Private txtNumero1 As B4XFloatTextField
    Private txtNumero2 As B4XFloatTextField
    Private lblNumero2 As B4XView
    Private lblOperacion As B4XView
    Private cboOperacion As B4XComboBox
    Private lblResultado As B4XView
    Private txtResultado As B4XFloatTextField
End Sub

Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")
   
    CodeLytMain.CreateCodeLytMain(txtNumero1, txtNumero2, cboOperacion, txtResultado)
   
    txtNumero1.Text = 20
    txtNumero2.Text = 15
   
    Dim LstOperaciones As List = Array("SUMAR", "DIVIDIR", "MULTIPLICAR")
    cboOperacion.SetItems(LstOperaciones)
   
End Sub

#Region EVENTOS
Private Sub cboOperacion_SelectedIndexChanged (Index As Int)
    CodeLytMain.RealizarOperacion
End Sub

Private Sub txtNumero1_TextChanged (Old As String, New As String)
    Sleep(50)
   
    CodeLytMain.RealizarOperacion
End Sub

Private Sub txtNumero2_TextChanged (Old As String, New As String)
    Sleep(50)
   
    CodeLytMain.RealizarOperacion
End Sub
#End Region

El resto de los subs de ese layout va en un módulo de código:
CodeLayout:
Sub Process_Globals
    Private fx As JFX
   
    Private Lyt As LytMain
   
    Type LytMain (    txtNumero1 As B4XFloatTextField, _
                    txtNumero2 As B4XFloatTextField, _
                    cboOperacion As B4XComboBox, _
                    txtResultado As B4XFloatTextField _
                    )
End Sub

Sub CreateCodeLytMain (txtNumero1 As B4XFloatTextField, txtNumero2 As B4XFloatTextField, cboOperacion As B4XComboBox, txtResultado As B4XFloatTextField) As LytMain
    Lyt.Initialize
    Lyt.txtNumero1 = txtNumero1
    Lyt.txtNumero2 = txtNumero2
    Lyt.cboOperacion = cboOperacion
    Lyt.txtResultado = txtResultado
    Return Lyt
End Sub

Sub RealizarOperacion
    Dim Operacion As String = Lyt.cboOperacion.SelectedItem

    Select Operacion
        Case "SUMAR"
            Lyt.txtResultado.Text = Lyt.txtNumero1.Text + Lyt.txtNumero2.Text
        Case "DIVIDIR"
            Lyt.txtResultado.Text = Lyt.txtNumero1.Text / Lyt.txtNumero2.Text
        Case "MULTIPLICAR"
            Lyt.txtResultado.Text = Lyt.txtNumero1.Text * Lyt.txtNumero2.Text
    End Select
End Sub

Quería conocer vuestra opinión, añade complejidad innecesaria?, difícil de mantener? hay mejores formas de conseguir la misma idea?
 

Attachments

  • Project.zip
    11 KB · Views: 158

josejad

Expert
Licensed User
Longtime User
Hola Ángel:

Más por lo que leo que por mi experiencia, creo que en vez de un módulo, deberías usar una clase (incluso Erel lo recomienda así en el hilo de Code Smells, punto 12). Te permite añadir subs y por tanto separar más el código, incluso para usar en distintas activities ASViewPager, ASTabStrip, ... lo ideal es añadirlo a una clase e instanciarlo en cada activity.
Aquí el amigo JordiCp comenta cómo cargar layouts desde la actividad a la clase, quizás te pueda ser de utilidad y de esta forma la actividad queda más "limpia" y te quitas un montón de sub de la misma, que estarán en la clase.
 

angel_

Well-Known Member
Licensed User
Longtime User
Gracias José, aún tengo que asimilar como encajaría lo que propone JordiCp en mi proyecto. En principio la limitación del módulo de código con una sola instancia no me supone un problema y si lo hago con una clase aún así tendré meter las declaraciones de los views y eventos dentro de la clase, esto es normal, pero no podría separar los subs relativos a esa clase (quizás esto tampoco sea lo más correcto).
 

Rubsanpe

Active Member
Licensed User
Hola. Tambien creo que es mejor usar una clase que un fichero de tipo código. Creo recordar que las clases pueden acceder a los eventos y lógica de las Activities, por lo que ahi se pueden definir las funciones que responden a los eventos de los controles.

Rubén
 
Top