Avatar billede alister_crowley Nybegynder
26. januar 2005 - 13:43 Der er 8 kommentarer og
1 løsning

Gøre kode objekt orienteret

Hej

Jeg er godt i gang med en irc bot i java, og jeg tænker at den nok kunne gøres mere objekt orienteret og struktureret end den er nu.

Koden er her, nogle forslag til hvad jeg kan ændre ?
(Java 1.4.x og bruger Eclipse som IDE)


package ircbot;

/**
IRC-bot v.3
@author: Claus Jørgensen
@date 23.01.05
*/

import java.io.*;
import java.net.*;
import java.util.Date;
import java.text.DateFormat;

public class IrcBot
{
  public static void main(String[] args) throws Exception
  {
    // variabler
    Socket ircSocket = null;
    PrintWriter out = null;
    BufferedReader in = null;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    PrintWriter pw = new PrintWriter(new FileOutputStream("ircbot.log", true)); // log fil
    int position;
    int port;
    long starttime = System.currentTimeMillis();
    String username = new String();
    String server = new String();
    String newtopic = new String();
    String msg = new String();
    String channel = new String();
    String line;
    String RealName = new String("Teh 1337 Java-Bot, by TheDeathArt");  // Beskrivelse af botten
    String operators[] = new String[100];

    System.out.print("Indtast server: \n");
    server = br.readLine();                          // IP'en til serveren

    System.out.print("Indtast port: \n");
    port = Integer.parseInt(br.readLine());          // Porten til IRC-serveren

    System.out.print("Indtast botnick: \n");
    String botnick = br.readLine();                  // Bottens nick

    // Åbner en socket til irc netværket

    try
    {
      ircSocket = new Socket(server , port);
      out = new PrintWriter(ircSocket.getOutputStream(), true);
      in = new BufferedReader(new InputStreamReader(ircSocket.getInputStream()));
    }
    catch (UnknownHostException e)
    {
      System.err.println("Kunne ikke finde: " + server);
      System.exit(1);
    }

    while((line = in.readLine()) != null)
    {
      String newlinet = line.substring(2);

      if(line.indexOf("!") > 0)
      {
        position = line.indexOf("!");
        username = line.substring(1,position);
      }
 
      if(newlinet.indexOf(":") > 0)
      {
        position = newlinet.indexOf(":") + 1;
        String newline = newlinet.substring(position);
        pw.println(newline);
        pw.flush();
 
        System.out.println(newline);  // udkskriver pæn linje
 
        if(newlinet.indexOf("#") > 0)
        {
          position = newlinet.indexOf("#");
          String newchannel = newlinet.substring(position);
          if(newchannel.indexOf(":") > 0)
          {
            position = newchannel.indexOf(":") - 1;
            channel = newchannel.substring(0,position);
          }
        }
      }
      else
      {
        System.out.println(line);
        pw.println(line);
        pw.flush();
      }
 
      if(line.indexOf("No ident respons") > 0)
      {
        out.println("USER " + botnick  + " none none : " +  RealName );
        out.println();
        out.println("NICK " + botnick);
        out.println();
      }
 
      if(line.indexOf("End of /MOTD command.") > 0)
      {
        out.println("PRIVMSG TheDeathArt : Teh 1337 JavaBot is online my master");
      }
 
      /* Ping-Pong servicen, sørger for at holde botten online */
 
      if(line.startsWith("PING"))
      {
        out.println("PONG " + line.substring(5));
        System.out.println("Ping? Pong!");
      }
 
      /* checker for !uptime */
 
      if(line.indexOf("!uptime") > 0)
      {
        long uptime = (System.currentTimeMillis() - starttime) / 1000;
        out.println("NOTICE " + username + " :Min Uptime er " + uptime + " sek. ");
      }
 
      if(line.indexOf("!time") > 0)
      {
        Date now = new Date();
        DateFormat nowTime = DateFormat.getTimeInstance();
        out.println("NOTICE " + username + " :" + "Klokken er: " + nowTime.format(now));
      }
 
      if(line.indexOf("!topic") > 0)
      {
        position = line.indexOf("!topic") + 7;
        try
        {
          msg = line.substring(position);
 
          for(int i = 0; i < operators.length; i++) // løber listen af operators igennem ved forsøg på at sætte topic via. !topic
          {
              if( operators[i].equalsIgnoreCase("@" + username) )
              {
                System.out.println(username + " er godkendt");
              }
              else
              {
                System.out.println(username + " er IKKE godkendt");
              }
          }
          out.println("TOPIC " + channel + " :" + msg);
        } catch (Exception e) {}
      }
 
      if(line.indexOf("!listopers") > 0)
      {
        for(int i = 0; i < operators.length; i++)
        {
          System.out.println("Operators: " + operators[i]);
        }
      }
 
      if(line.indexOf("!say") > 0)
      {
        position = line.indexOf("!say") + 5;
        try
        {
          msg = line.substring(position);
          out.println("PRIVMSG " + channel + " :" + msg);
        } catch (Exception e) {}
      }
 
      if(line.indexOf("!join") > 0)
      {
        position = line.indexOf("!join") + 6;
        try
        {
          msg = line.substring(position);
          out.println("JOIN " + msg);
        } catch (Exception e) {}
      }

      if(line.indexOf("!part") > 0)
      {
        position = line.indexOf("!part") + 6;
        try
        {
          msg = line.substring(position);
          out.println("PART " + msg);
        } catch (Exception e) {}
      }
 
      /* lukker botten */
 
      if(line.indexOf("!quit") > 0)
      {
        out.println("QUIT : Farvel, og tak for denne gang");
        out.close();
        in.close();
        ircSocket.close();
        System.exit(0);
      }
 
      if(line.indexOf("!auth") > 0)
      {
        out.println("PRIVMSG Q@CServe.quakenet.org :AUTH JavaBot xhtml2004");
        System.out.println(" Q@CServe.quakenet.org :AUTH JavaBot xhtml2004");
      }
    }

    // Lukker sockets igen.
    out.close();
    in.close();
    ircSocket.close();
  }
}
Avatar billede arne_v Ekspert
26. januar 2005 - 13:50 #1
Problem stillingen er vist ikke særligt objekt orienteret !

Men du kunne jo gøre kode procedurel ved at få splittet den op i nogle
overskuelige metoder af 5-20 linier.
Avatar billede alister_crowley Nybegynder
26. januar 2005 - 14:41 #2
Har lige startet med de simple funktioner, men denne her kode giver ret mange fejl

package ircbot;

/**
IRC-bot v.3
@author: Claus Jørgensen
@date 23.01.05
*/

import java.io.*;
import java.net.*;

public class IrcBot
{
  Socket ircSocket = null;
  PrintWriter out = null;
  BufferedReader in = null;
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
  public static void main(String[] args) throws Exception
  {
      connect("localhost",6667,br);
  }

  public static void connect(String server, int port, BufferedReader br)
  {
    System.out.print("Indtast server: \n");
    server = br.readLine();                          // IP'en til serveren

    System.out.print("Indtast port: \n");
    port = Integer.parseInt(br.readLine());          // Porten til IRC-serveren

    System.out.print("Indtast botnick: \n");
    String botnick = br.readLine();                  // Bottens nick

    try
    {
      ircSocket = new Socket(server, port);
      out = new PrintWriter(ircSocket.getOutputStream(), true);
      in = new BufferedReader(new InputStreamReader(ircSocket.getInputStream()));
    }
    catch (UnknownHostException e)
    {
      System.err.println("Kunne ikke finde: " + server);
      System.exit(1);
    }
  }

  public void close()
  {
    out.close();
    in.close();
    ircSocket.close();
  }

}


Fejls:

Severity    Description    Resource    In Folder    Location    Creation Time
2    Cannot make a static reference to the non-static field br    IrcBot.java    IRCBOT/ircbot    line 21    26. januar 2005 14:39:35
2    Cannot make a static reference to the non-static field ircSocket    IrcBot.java    IRCBOT/ircbot    line 37    26. januar 2005 14:39:35
2    Cannot make a static reference to the non-static field ircSocket    IrcBot.java    IRCBOT/ircbot    line 38    26. januar 2005 14:39:35
2    Cannot make a static reference to the non-static field out    IrcBot.java    IRCBOT/ircbot    line 38    26. januar 2005 14:39:35
2    Cannot make a static reference to the non-static field in    IrcBot.java    IRCBOT/ircbot    line 39    26. januar 2005 14:39:35
2    Cannot make a static reference to the non-static field ircSocket    IrcBot.java    IRCBOT/ircbot    line 39    26. januar 2005 14:39:35
2    Unhandled exception type IOException    IrcBot.java    IRCBOT/ircbot    line 51    26. januar 2005 14:39:35
2    Unhandled exception type IOException    IrcBot.java    IRCBOT/ircbot    line 52    26. januar 2005 14:39:35


Men kan ikke forstå hvorfor.
Avatar billede arne_v Ekspert
26. januar 2005 - 15:04 #3
Jeg tror at den vil have dem her lavet static:

Socket ircSocket = null;
  PrintWriter out = null;
  BufferedReader in = null;
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Avatar billede alister_crowley Nybegynder
26. januar 2005 - 15:05 #4
og hvordan gøres det ?
Avatar billede arne_v Ekspert
26. januar 2005 - 15:13 #5
static Socket ircSocket = null;
  static PrintWriter out = null;
  static BufferedReader in = null;
  static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Avatar billede alister_crowley Nybegynder
31. januar 2005 - 22:37 #6
statiske variabler er nice, ved ikke hvorfor, men de er meget nemmere at arbejde med :)

Og så er det vist lukketid, så du må godt ligge det klassiske svar.
Avatar billede arne_v Ekspert
31. januar 2005 - 23:18 #7
procedural programmering (som static felter og metoder er) er nemmere
end objekt orienteret programmering

men til mere avancerede ting er det heller ikke så godt

det der gør din problem stilling så speciel er at der ikke rigtigt er nogen
objekter - det er bare ren kode
Avatar billede arne_v Ekspert
31. januar 2005 - 23:18 #8
svar
Avatar billede alister_crowley Nybegynder
31. januar 2005 - 23:20 #9
okay, så går der nok et stykke tid før det bliver væsenligt at kode OOP for midt vedkommene :)

Men det hjalp da en hel del alligevel.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester