Q:

Implementación de datos recogidos de JTextFields a Tableview

Buenas a todos y gracias de antemano. He elaborado un programa de JavaFx por el cual se recogen los datos introducidos en los JTextFields y se muestra a través de un Button a una TableView. El código funciona perfectamente pero mi tutor me ha recomendado implementar dos clases , una tipo Alumno (con tus atributos) y otra por ejemplo AlmacenNotas la cual sirva para meter los datos en la tabla.
Mi duda es la siguiente, ¿que funcionalidad puedo derivar en la nueva clase?.  Solo he necesitado una clase Alumno y la clase controladorPrincipal para crear dicha aplicación por lo que no entiendo bien la necesitad de una segunda clase.
En resumen, se puede hacer más eficiente el código en dos clases + controlador (+ vista y prncipal). 
Clase Alumno:

 //Importamos los paquetes
    package aplicacionalumnos;
    import javafx.beans.property.SimpleIntegerProperty;
    import javafx.beans.property.SimpleStringProperty;
    /**
    *
    * @author Raul
    */
    //Clase Alumno con sus atributos de tipo SimpleProperty de cara a la T 
    TableView
    public class Alumno {
    private final SimpleStringProperty dni;
    private final SimpleStringProperty asignatura;
    private final SimpleIntegerProperty nota;
    private final SimpleIntegerProperty recuperacion;
    //Constructor
    public Alumno(String dni, String asignatura, int nota, int recuperacion) {
    this.dni = new SimpleStringProperty(dni);
    this.asignatura = new SimpleStringProperty(asignatura);
    this.nota = new SimpleIntegerProperty(nota);
    this.recuperacion = new SimpleIntegerProperty(recuperacion);
    }
     //Getters y Setters
     public String getDni() {
     return dni.get();
     }

     public void setDni(String dni) {
     this.dni.set(dni);
     }

     public String getAsignatura() {
     return asignatura.get();
    }

    public void setAsignatura(String asignatura) {
    this.asignatura.set(asignatura);
    }

    public  int getNota() {
    return nota.get();
    }

    public void setNota(int nota) {
    this.nota.set(nota);
    }

    public int getRecuperacion() {
    return recuperacion.get();
    }

    public void setRecuperacion(int recuperacion) {
    this.recuperacion.set(recuperacion);
    }
    }

Clase controladorPrincipal:

package controladores;
     import aplicacionalumnos.Alumno;
     import aplicacionalumnos.almacenNotas;
     import static java.lang.Integer.parseInt;
     import java.net.URL;  
     import java.util.ResourceBundle;
     import java.util.regex.Pattern;
     import javafx.collections.FXCollections;
     import javafx.collections.ObservableList;
     import javafx.event.ActionEvent;
     import javafx.fxml.FXML;
     import javafx.fxml.Initializable;
     import javafx.scene.control.Button;
     import javafx.scene.control.TableColumn;
     import javafx.scene.control.TableView;
     import javafx.scene.control.TextField;
     import javafx.scene.control.TextFormatter;
     import javafx.scene.control.Tooltip;
     import javafx.scene.control.cell.PropertyValueFactory;
     import javafx.scene.input.KeyEvent;
     import javax.swing.JOptionPane;


     public class controladorPrincipal implements Initializable {
    
     @FXML public TextField txDni;
     @FXML public TextField txAsignatura;
     @FXML public TextField txNota;
     @FXML public TextField txRecuperacion;
     @FXML Button btnGuardarNota;
     @FXML TableView tblAlumnos;
     @FXML TableColumn tcDni;
     @FXML TableColumn tcAsignatura;
     @FXML TableColumn tcNota;
     @FXML TableColumn tcRecuperacion;

     String fNota = "10|[0-9]";
     String fRecuperacion = "5|[0-5]";
    
     private final ObservableList<Alumno> listaDatos = 
     FXCollections.observableArrayList();

    
    @FXML private void handletxDni(KeyEvent event) {
    // Controlamos el tamaño del campo de texto
    if (txDni.getText().length() >= 9) {
    event.consume();
    }
    }
    @FXML private void handletxAsignatura(KeyEvent event) {
    // Controlamos el tamaño del campo de texto
    if (txAsignatura.getText().length() >= 15) {
    event.consume();
    }

    }
     
 
    @FXML private void handleGuardarNota(ActionEvent event){
    Alumno datos;

     try {
     datos = new 
     Alumno(txDni.getText(),txAsignatura.getText(),parseInt(txNota.getText()),
     parseInt(txRecuperacion.getText()) );
     listaDatos.add(datos);


     txDni.setText("");
     txAsignatura.setText("");
     txNota.setText("");
     txRecuperacion.setText("");


     } catch (Exception e) {
     JOptionPane.showMessageDialog(null, "Debe rellenar todos los campos antes 
     de guardar");
     }

        
     }
  
       @Override
       public void initialize(URL url, ResourceBundle rb) {
        txNota.setTooltip(new Tooltip("Solo valores entre 0 y 10 incluidos"));
        txRecuperacion.setTooltip(new Tooltip("Solo valores entre 0 y 5 
        incluidos"));
        txDni.setTooltip(new Tooltip("El documento debe ser de 9 caracteres "));
        txAsignatura.setTooltip(new Tooltip("Máximo 15 caracteres"));
        
        btnGuardarNota.setTooltip(new Tooltip("Se guardarán los datos"));
        
        TextFormatter<String> formatterNota = new TextFormatter<String>(change -
        > {
        String text = change.getControlNewText();
        if (!Pattern.matches(fNota, text)) {
            change.setText("");
        }
        return change;
         });
        TextFormatter<String> formatterRecuperacion = new TextFormatter<String>
        (change -> {
        String text = change.getControlNewText();
        if (!Pattern.matches(fRecuperacion, text)) {
            change.setText("");
        }
        return change;
    });
    txNota.setTextFormatter(formatterNota);
    txRecuperacion.setTextFormatter(formatterRecuperacion);

        
        
      tcDni.setCellValueFactory( new PropertyValueFactory<Alumno, String>
      ("dni"));
      tcAsignatura.setCellValueFactory(new PropertyValueFactory<Alumno, String>
      ("asignatura"));
      tcNota.setCellValueFactory(new PropertyValueFactory<Alumno, String>
      ("nota"));
      tcRecuperacion.setCellValueFactory(new PropertyValueFactory<Alumno, 
     String>
     ("recuperacion"));
      tblAlumnos.setItems(listaDatos);   
     }    
    
    
     }

A:

No creo que introducir una clase para manejar la colección de alumnos sea una mejora. La lista observable es suficiente para almacenar y gestionar los datos que se muestran de la tabla, por lo que una clase adicional no es necesaria.
Sí podrías mejorar otras cosas en este programa, como por ejemplo:   

Unificar los TextFormatter en una clase independiente que recibe
como  parámetro la expresión regular a usar en cada caso.
Manejar con esta misma clase y una expresión regular diferente el
tamaño máximo de los textos Adignatura y DNI.
Usar correctamente las propiedades y los enlaces de JavaFx para
escribir automáticamente los valores en los componentes Textfield
al objeto Alumno.

Sin embargo, si tu programa crece en funcionalidad, de hecho necesitarás una clase AlmacenAlumno y debes tener esto en mente. Esta clase podría contener operaciones como agregar, eliminar o editar alumno e implementará validaciones como que no se repitan los DNI cuando estás agregando un nuevo alumno.
Si bien es bueno ser organizado y cumplir con los patrones de diseño, mejor es que tu código sea óptimo, recuerda que: "la perfección en un programa se alcanza cuando no hay nada más que quitar..."

