Jump to content
Gnrtuga

Organização do código

Recommended Posts

Gnrtuga

Olá pessoal, eu sou daqueles "programadores" que vão aprendendo sozinhos (livros, P@P e experiências) e por isso às vezes tenho dúvidas que acho que devem ser básicas (como esta) para quem percebe disto.

Um dos meus grandes males é programar tudo na Main Page, o que por vezes cria um código tão desorganizado que nem eu sei onde ando.

No código que vou deixar em baixo tenho alguns métodos (Leitor_Artigo, Art1) que  gostaria de colocar noutro sitio (numa classe, acho eu) de forma a ficar mais organizado, porque por exemplo os métodos dos artigos (Art1) não têm grande coisa dentro deles, mas se multiplicarmos essa meia dúzia de linhas por + de 300 artigos fico com muitas linhas e com muita dificuldade em encontrar seja o que for...

Tentei criar uma classe e colar lá os métodos, mas apareceram logo erros e  eu fiquei sem saber o que fazer..

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.Storage;      //*file access 
using Windows.UI.Popups;    //*Messagebox 
using Windows.Storage.Streams;
using Windows.UI.Xaml.Documents; //adicionei este por causa do RichTextBlock
using System.Text; // este foi adicionado por causa do encoding
//</ add namespaces > 


// O modelo de item de Página em Branco está documentado em https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x416

namespace CodigoPenal
{
    /// <summary>
    /// Uma página vazia que pode ser usada isoladamente ou navegada dentro de um Quadro.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();

        }



        private void BotaoBloco_Click(object sender, RoutedEventArgs e)

        {
            Limpa();
            Art2();

        }

        private void streamreader_Click(object sender, RoutedEventArgs e)
        {
            Limpa();
            Art1();


        }

        //Este Leitor vai ler os artigos e manda o texto para blocotexto
        public async void Leitor_Artigos(string Artigo)
        {
            
            StorageFile OpenedStorageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri(this.BaseUri, Artigo));

            if (OpenedStorageFile != null)
            {
                try
                {
                    IRandomAccessStream randomAccStream = await OpenedStorageFile.OpenAsync(FileAccessMode.Read);
                    var st = randomAccStream.AsStream();
                    StreamReader sr = new StreamReader(st, Encoding.UTF7);
                    string s = await sr.ReadToEndAsync();
                    Paragraph paragraph = new Paragraph();
                    Run run = new Run();
                    run.Text = s;
                    paragraph.Inlines.Add(run);
                    blocotexto.Blocks.Add(paragraph);
                    
                }
                catch (Exception ex)
                {
                    MessageDialog md = new MessageDialog(ex.Message);
                    await md.ShowAsync();
                }

            }

        }

        // Este Leitor vai ler a Jurisprudência e enviar para juri
        public async void Leitor_Juri(string ArtigoJuri)
        {

            StorageFile OpenedStorageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri(this.BaseUri, ArtigoJuri));

            if (OpenedStorageFile != null)
            {
                try
                {
                    IRandomAccessStream randomAccStream = await OpenedStorageFile.OpenAsync(FileAccessMode.Read);
                    var st = randomAccStream.AsStream();
                    StreamReader sr = new StreamReader(st, Encoding.UTF7);
                    string s = await sr.ReadToEndAsync();
                    Paragraph paragraph = new Paragraph();
                    //Faz o mesmo que o metedo Leitor_Artigos, mas tem a parte do Run simplificada
                    Run run = new Run
                    {
                        Text = s
                    };
                    
                    paragraph.Inlines.Add(run);
                    juri.Blocks.Add(paragraph);

                }
                catch (Exception ex)
                {
                    MessageDialog md = new MessageDialog(ex.Message);
                    await md.ShowAsync();
                }

            }

        }

        //método para limpar as caixas de texto
        public void Limpa()
        {
            titulo.Text = "";
            blocotexto.Blocks.Clear();
            Jurisprudencia.Text = "";
            juri.Blocks.Clear();




        }

        //métodos que vão ser chamados pelos botões
        public void Intro()
        {
            string Artigo = "Livro1/Introducao.txt";
            Leitor_Artigos(Artigo);
            titulo.Text = "Introdução";
        }
        public void Art1()
        {
            string Artigo = "Livro1/Artigo1_PrincipioLegalidade.txt";
            Leitor_Artigos(Artigo);
            NumeroArtigo.Text = "Artigo 1º";
            titulo.Text = "PRINCIPÍO DA LEGALIDADE";
        }

        public void Art2()
        {
            string Artigo = "Livro1/Artigo2_AplicacaoTempo.txt";
            NumeroArtigo.Text = "Artigo 2º";
            titulo.Text ="APLICAÇÃO NO TEMPO";
            Leitor_Artigos(Artigo);
            Jurisprudencia.Text = "Jurisprudência";
            String ArtigoJuri = "Livro1/Artigo2_Juris.txt";
            Leitor_Juri(ArtigoJuri);
        }
       
    }
}

Como é que eu consigo organizar isto?

Obrigado 


Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!)

Nunca mais é verão outra vez.. :)

Share this post


Link to post
Share on other sites
Markkex

Podes criar uma library onde podes por o codigo menos importante. Crias o metodo nessa library, escreves o codigo que precisas nessa library e no codigo principal é só invocares o metodo. Assim deixas a pagina principal só com os metodos e na library fica todo o codigo que necessitas de escrever para acontecer o que queres que aconteça.

Tem um metodo diferente do que estás habituado mas vais ver que vai-te ajudar a organizar melhor o codigo. 

Dá uma olhada aqui (https://docs.microsoft.com/en-us/dotnet/core/tutorials/library-with-visual-studio) ou entao procura tutoriais na net é sempre mais fácil. 

Espero que tenha ajudado! 

Share this post


Link to post
Share on other sites
Gnrtuga

Markkex, obrigado pela ajuda mas mesmo assim estou confuso...

Para usar por exemplo este método:

 public void Limpa()
        {
            titulo.Text = "";
            blocotexto.Blocks.Clear();
            Jurisprudencia.Text = "";
            juri.Blocks.Clear();
        }

Tenho mesmo que criar um Class Library? Eu não quero usar noutra solução... É que estes campos são campos do XAML (não sei se existe outra definição) , e o que quero é apenas apagar o conteúdo dos mesmos..

Mesmo colocando dentro de uma classe no mesmo projecto, ele queixa-se de que os campos não existem no contexto actual...

Numa Class Library (o mesmo método) queixa-se da mesma coisa...

using System;

namespace Ajudas
{
    public class BibliotecaAjuda
    {
        public void Limpa()
        {
            titulo.Text = "";
            blocotexto.Blocks.Clear();
            Jurisprudencia.Text = "";
            juri.Blocks.Clear();

           

        }
    }

}

Falta-me algum using? 

Tou completamente perdido... :(


Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!)

Nunca mais é verão outra vez.. :)

Share this post


Link to post
Share on other sites
coxosclassic

Boas,

Tenta implementar MVC (por ex.) no teu projeto. Desenvolver á volta de um padrão pode ajudar muito na organização do projeto.

 

cumps.

  • Vote 1

Cumps,

cc

Share this post


Link to post
Share on other sites
Gnrtuga

Obrigado coxosclassic, mas isso já é um nível acima, ainda estou na parte mais básica de organizar (tentar) por classes e módulos.

Já tentei fazer o descrito no site recomendado pelo markkex (Standard Library), que penso que deve andar dentro do que eu estava a pensar, no entanto no meu visual studio não me aparece (ou não encontro) o passo 5 (Build Solution)., e o ficheiro que fica guardado (qualquercoisa.cs), não o consigo adicionar às referências do solution explorer...

Deve ser básico, mas certamente devo estar a fazer algo mal.

O site que me sugeriste, há de ser para ler (e tentar aplicar) mais tarde.

De qualquer forma, obrigado pela ajuda.


Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!)

Nunca mais é verão outra vez.. :)

Share this post


Link to post
Share on other sites
RicardoCosta

Boas,

O teu método Limpa não funciona porque tu tens os botões no form, Ou seja, a classe que estas a tentar usar não sabe o que são esses botões.

Se queres realmente organizar código pensa antes assim, tenta separar negócio da apresentação (o form). O método Limpa por exemplo, é uma funcionalidade do form ou seja, nada tem a ver com o negócio. Para este caso podes deixar o Limpa no Main.

Agora por exemplo para os métodos Leitor_Artigos e Leitor_Juri, a parte em que estas a ler o ficheiro podes meter à parte e assim reutilizar o código. Crias por exemplo uma classe Leitor com o método Ler que recebe um url e retorna string.  

namespace Ajudas
{
    public class Leitor
    {
      	private readonly Uri path;
      
      	public Leitor(Uri path)
        {
        	this.path = path;
        }
      
        public async string Ler()
        {
			StorageFile OpenedStorageFile = await StorageFile.GetFileFromApplicationUriAsync(path);

        	if (OpenedStorageFile == null) throw new ArgumentNullException("Path is null!");
            
        	IRandomAccessStream randomAccStream = await OpenedStorageFile.OpenAsync(FileAccessMode.Read);
        	var st = randomAccStream.AsStream();
        	StreamReader sr = new StreamReader(st, Encoding.UTF7);
        	return await sr.ReadToEndAsync();
        }
    }

}

 

E nos teus métodos Leitor_Artigos e Leitor_Juri podes usar assim:

var path = new Uri(this.BaseUri, ArtigoJuri);
var leitor = new Leitor(path);
var texto = leitor.Ler();

Desta forma, sempre que quiseres ler ficheiros só tens de chamar a classe leitor. Poderás ainda estender a funcionalidade e criar o método Escrever(string texto) para quando queres escrever para um ficheiro.

Cumprimentos

Edited by RicardoCosta

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.