Form processing: How to process form before output and access data from shortcode

A possible solution, a good one I think, is to use a object with a property to store the validation status so you set the value of this property in the init action hook where you process the form and access to it in the shortcode. For example:

class MyForm {

    private $validate;

    function __construct() {
         add_shortcode( 'myform', array($this, 'wpse_my_form_shortcode') );
         add_action( 'init', array($this, 'wpse_process_my_form') );
    }

    function wpse_my_form_shortcode( $atts ) {
        // Somehow get the errors ($validate) generated in the function attached to init

        $output="";

        // output form (with errors if found)
        if( $this->validate['success'] == 'error' ){
             $output .= '<div class="error">'.$this->validate['message'].'</div>';
        }
        $output .= '<form name="my_form" method="post">';
        $output .= '<input type="text" name="form_data">';
        $output .= '<button type="submit">'.__('Submit').'</button>';
        $output .= '</form>';

        return $output;

    }

    function wpse_process_my_form() {
        if( isset($_POST['form_data']) ) {
            $this->wpse_validate_my_form( $_POST['form_data'] );
            if ( $this->validate['success'] == 'success' ) {
                $success = $this->wpse_save_my_form( $_POST['form_data'] );
                if ( $success ) {
                    wp_redirect( '/success', 302 );
                    exit();
                }
            }
        }
    }

    function wpse_save_my_form( $form_data ) {
        // Run save process here, return true if successful
        return true;
    }

    function wpse_validate_my_form( $data ) {

        $validation = array();

        if( $data == 'validate_me' ) {
            $validation['success'] = "success";
            $validation['message'] = "the success message";
        } else {
            $validation['success'] = "error";
            $validation['message'] = "the error message";
        }

        $this->validate = $validation;

    }

}
new MyForm();

Note: It is a quick example to show you the point.