Używanie metod klasy z innych metod tej klasy

0

Czy taka kombinacja jest okej?

Staram się ograniczyć powielanie kodu nawet w metodach tej samej klasy więc metoda A używa metody B. Czy to dobre rozwiązanie?

   public interface IView
    {
        void Clear();
        void Clear(Point point);

        void Draw(object obj, Point point);
        void Draw(object obj, Point point, object color);
    }

public class ConsoleView : IView
    {
        public void Clear() => Console.Clear();
        public void Clear(Point point) => this.Draw(' ', point);

        public void Draw(object obj, Point point) => this.Draw(obj, point, ForegroundColor);
        public void Draw(object obj, Point point, object color)
        {
            ForegroundColor = (ConsoleColor)color;
            SetCursorPosition(point.X, point.Y);
            Write(obj.ToString());
        }
    }

0

Nie odpowiem od strony C# i twojego kodu, bo aż tak go nie znam. W ogólności, według mnie to rozwiązanie jest dobre, ponieważ zasada przez ciebie użyta jest jedną z fundamentalnych dla mnie (i nie tylko dla mnie ;) ) zasad programowania: https://pl.wikipedia.org/wiki/DRY. Dodatkowo, nie uważam, żeby to nawet zależało od języka. Choć być może tyle jest zdań co do tego, ile programów. ;)

0

Generalnie rozwiązanie jest ok, ale w takiej sytuacji pytanie czy nie warto zmodyfikować interfejsu i klasy, aby zamiast dwóch metod draw była jedna, która ma trzeci argument jako opcjonalny z określoną wartością domyślną.

Czy ten kod Ci działa? Odwołujesz się z metody, która ma dwa parametry do metody, która przyjmuje trzy...

0

A czemu argument color jest typu object, a nie ConsoleColor?

0

Argument "color" jest typu object dlatego, że planuję przenieść to też na aplikację graficzną i staram się napisać jak najbardziej uniwersalny kod.

0

Staram się ograniczyć powielanie kodu nawet w metodach tej samej klasy więc metoda A używa metody B. Czy to dobre rozwiązanie?

Jako ciekawostka (głównie), sposób na oczyszczenie takiego interfejsu w C#:

public interface IView
{
    void Clear();

    object ForegroundColor { get; }
    void Draw(object obj, Point point, object color);
}

public class ConsoleView : IView
{
    public void Clear() => Console.Clear();

    public object ForegroundColor { get; set; }

    public void Draw(object obj, Point point, object color)
    { /* realna implementacja draw */ }
}

public static class ViewExtensions
{
    public static void Clear(this IView view, Point point)
    {
        view.Draw(' ', point);
    }

    public static void Draw(this IView view, object obj, Point point)
    {
        view.Draw(obj, point, view.ForegroundColor);
    }
}

Wtedy nie musisz powtarzać implementacji Draw(object, Point) i Clear(Point) w kazdej klasie implementującej interfejs.

2
Mały Kot napisał(a):

Argument "color" jest typu object dlatego, że planuję przenieść to też na aplikację graficzną i staram się napisać jak najbardziej uniwersalny kod.

I na czym konkretnie ta uniwersalność ma polegać? Że będziesz mógł podać obiekt dowolnego typu, a aplikacja się wypieprzy, gdy nie będzie on typu ConsoleColor?
Rozwiązania uniwersalne to takie, w których wiadomo o co chodzi, z dobrze zdefiniowanym API i zabezpieczone przed błędami użytkowników.

1 użytkowników online, w tym zalogowanych: 0, gości: 1