Vinnaren i pepparkakshustävlingen!
  • 2
  • 3
2017-05-14, 19:49
  #25
Medlem
Citat:
Ursprungligen postat av IIMorbiid
Fan alltså jag är skit kass på det, vet inte alls hur jag ska skriva.. Vad är det jag missar egentligen?

Är inte vidare bra på det heller, men tänk att du skriver det på "kod"språk, inte vanlig engelska.

Kod:
switch on userchoice
 
case newPost
    set title from userinput
    set message from userinput 

något sånt i princip
Citera
2017-05-17, 01:17
  #26
Medlem
Ibland önskar jag att spöstraff kunde utmätas till lärare...

Såhär har jag valt att skriva programmet...

OBS! Gör inte misstaget att bara köra copy/paste för ingen av lärarna skulle tro att det var du som skrivit det. Dock är det inte omöjligt att det lär dig något som du kan ha nytta av längre fram

Jag har "bara" gjort så att man kan lägga in nya LogEntries, söka och skriva ut alla, men det ger en rätt bra bild på hur man skulle kunna skriva programmet på ett mer realistiskt sätt

Kod:
using System;
using System.Collections.Generic;
using System.Linq;

namespace TestConsoleApp
{
    //En klass som beskriver själva inlägget
    public class LogEntry
    {
        //Åt helvete med en vektor för att beskriva logentryn här har du 
        //egenskaper som gör att det blir VÄLDIGT mycket enklare att veta
        //vad som är vad... detta går emot uppgiften på E nivå, men fungerar
        //på A nivå då det efterfrågar objektorientering
        public DateTime LogEntryDate { get; set; }
        public string Title { get; set; }
        public string Entry { get; set; }

        public LogEntry(string title, string entry)
        {
            Title = title;
            Entry = entry;
            LogEntryDate = DateTime.Now;
        }

        //Letar efter sökordet i både titel och inlägg, söker mot små bokstäver för att ignorera case
        //returnerar true om logentryn innehåller sökordet
        public bool Contains(string search)
        {
            return Title.ToLower().Contains(search.ToLower()) || Entry.ToLower().Contains(search.ToLower());
        }

        //Här skriver vi över objektets egen ToString metod vilket ersätter sättet att skriva ut när man kör myLogEntry.ToString()
        public override string ToString()
        {
            //Det skulle vara intressant att se om läraren kan detta, det är C# 6 stränginterpolering vilket är ett väldigt trevligt sätt
            //skriva strängar på. I det här fallet visar jag titeln på ena raden och själva inlägget på andra.
            return $@"{Title}
{Entry}";
        }
    }

    //Loggboken innehåller dels en lista med LogEntries men även metoder som används för att manipulera eller söka i listan
    public class LogBook
    {
        //Nyhet i C# 6 som tillåter att man sätter ett defaultvärde på en property, tidigare var man tvungen att göra detta i en konstruktor
        public List<LogEntry> LogEntries { get; set; } = new List<LogEntry>();

        //Enkel metod som plockar in en LogEntry och lägger till den i listan
        public void AddEntry(LogEntry entry)
        {
            LogEntries.Add(entry);
        }

        //Metod som söker fram LogEntries
        public List<LogEntry> SearchEntries(string searchWord)
        {
            //Om användaren skickar in en tom sträng så får denne ut hela listan med LogEntries
            if (string.IsNullOrWhiteSpace(searchWord))
                return LogEntries;

            //Lambdauttryck där jag säger att jag vill ha de LogEntries där LogEntryns.Contains metod returnerar true. Skicka tillbaka resultatet som en lista
            return LogEntries.Where(x => x.Contains(searchWord)).ToList();
        }
    }

    //Klass som hanterar själva programmet, rent krasst borde det vara spöstraff att lägga in all kod direkt i Main metoden, men jag är väldigt
    //medveten om att det är så man brukar göra i skolan. Här har jag dock skapat en separat klass för hanteringen
    public class LogBookWorker
    {
        //Här har vi en instans av själva loggboken 
        private LogBook logBook = new LogBook();

        //Metod som skriver ut själva huvudmenyn
        private void DisplayMenu()
        {
            Console.WriteLine();
            Console.WriteLine("Welcome!");
            Console.WriteLine();
            Console.WriteLine("[1] Write new entry.");
            Console.WriteLine("[2] Search entry.");
            Console.WriteLine("[3] Print all entries.");
            Console.WriteLine("[4] Exit.");
        }

        //Metod som skriver ut en LogEntry. Notera här att jag kör entry.ToString() vilket är den förändring av ToString jag gjorde i själva LogEntryn
        //Rent krasst kan du göra precis som i LogEntryn här också
        private void DisplayEntry(LogEntry entry)
        {
            Console.WriteLine("---");
            Console.WriteLine(entry.ToString());
            Console.WriteLine();
        }

        //Metod som hanterar nya LogEntries. Den läser in data och skickar tillbaka en ny LogEntry som innehåller den data användaren skickade in
        private LogEntry NewEntry()
        {
            Console.WriteLine("New entry");
            Console.WriteLine("Please enter you new log entry");
            Console.WriteLine();
            Console.Write("Title: ");
            string title = Console.ReadLine();
            Console.Write("Entry: ");
            string entry = Console.ReadLine();

            return new LogEntry(title, entry);
        }

        //Metod som hanterar en sökning. Returnerar det eller de sökord användaren matat in
        private string NewSearch()
        {
            Console.WriteLine("Search");
            Console.Write("Search word: ");
            return Console.ReadLine();
        }

        //Här är själva huvudmetoden som hanterar hela loggboksapplikationen. Märk att det INTE är en statisk metod och att den INTE är public static void Main(string[] args)
        public void StartLogBook()
        {
            //Börja med att rensa konsollen
            Console.Clear();

            //Visa meny första gången
            DisplayMenu();

            //Fortsätt till fan avlöser oss... eller att du väljer att avsluta frivilligt
            while (true)
            {
                //Här läser jag in en tangentbordstryckning. Skillnaden mellan ReadLine och ReadKey är att readkey
                //är omedelbar, dvs användaren ges ingen extra möjlighet att skriva i en massa dålig data.
                ConsoleKeyInfo key = Console.ReadKey();

                //Rensa konsollen igen så att den är reda för vad det är för typ av menyalternativ man valt
                Console.Clear();

                switch (key.KeyChar)
                {
                    case '1': //Add entry
                        //Anropa metoden som lägger till en ny LogEntry, lägg in resultatet i logboken utan att lägga in den i en variabel först
                        logBook.AddEntry(NewEntry());
                        //Rensa konsollen för att förbereda för menyn
                        Console.Clear();
                        break;
                    case '2': //Search entries
                        //Anropa logbokens sökfunktion med resultatet av en ny sökning
                        var entries = logBook.SearchEntries(NewSearch());
                        //Rensa konsollen för att förbereda utskrift av hittade LogEntries
                        Console.Clear();
                        //Gå igenom listan och skriv ut alla sökresultat
                        entries.ForEach(x => DisplayEntry(x));
                        break;
                    case '3':
                        //Gå igenom alla LogEntries och skriv ut dem
                        logBook.LogEntries.ForEach(x => DisplayEntry(x));
                        break;
                    case '4':
                        //Lämnar metoden och avslutar programmet
                        return;
                    default:
                        //Om användaren fyller i något ogiltigt tecken vi inte känner igen 
                        //så meddela användaren att det blev fel och att den ska försöka igen
                        Console.WriteLine("Something went wrong, try again.");
                        break;
                }

                //Skriv ut menyn på nytt
                DisplayMenu();
            }
        }
    }

    //Här är själva programmet som startas. Som du ser har jag så lite kod som möjligt i programmet
    //Main metoden ska bara vara ett sätt att starta programmet, inte köra själva programmet
    //På det här sättet så skapar jag en ny instans av LogBookWorker och sen direkt kör igång själva
    //programmet i den nyskapade instansen. Inte en static i övrigt så långt ögat når. Tyvärr är det
    //här något man inte verkar gå igenom på kurser i skolan. Static är bra i vissa begränsade fall,
    //men på det stora hela bör det undvikas så mycket som möjligt i vanlig kod.
    class Program
    {
        static void Main(string[] args)
        {
           new LogBookWorker().StartLogBook();
        }
    }
}
Citera
  • 2
  • 3

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback