Jak mógłbym zrefaktoryzować te ify?

0

Witam, potrzebuje pomysłu jak mogę zmniejszyć ilość tego kodu

public static bool zwroc_wynik( int wynik_gospodarz, int wynik_gosc, string typ)
{
	if (wynik_gospodarz > wynik_gosc && typ == "1")
	{
		return true;
	}
	else if (wynik_gospodarz == wynik_gosc && typ == "0")
	{
		return true;
	}
	else if (wynik_gosc > wynik_gospodarz && typ == "2")
	{
		return true;
	}
	else if ((wynik_gospodarz > wynik_gosc || wynik_gospodarz == wynik_gosc) && typ == "10")
	{
		return true;
	}
	else if ((wynik_gosc > wynik_gospodarz || wynik_gospodarz == wynik_gosc) && typ == "02")
	{
		return true;
	}
	else if ((wynik_gosc > wynik_gospodarz || wynik_gospodarz < wynik_gosc) && typ == "12")
	{
		return true;
	}
	else
	{
		return false;
	}
}

Teoretycznie chyba mógłbym zrobić to tak, ale czy jest to poprawne i nie da się tego lepiej zrobić?
Chociaż wizualnie, żeby zwiększyć przejrzystość.

public static bool zwroc_wynik( int wynik_gospodarz, int wynik_gosc, string typ)
{
if (
		(wynik_gospodarz > wynik_gosc && typ == "1") ||
		(wynik_gospodarz == wynik_gosc && typ == "0") ||
		(wynik_gosc > wynik_gospodarz && typ == "2") ||
		((wynik_gospodarz > wynik_gosc || wynik_gospodarz == wynik_gosc) && typ == "10") ||
		((wynik_gosc > wynik_gospodarz || wynik_gospodarz == wynik_gosc) && typ == "02") ||
		((wynik_gosc > wynik_gospodarz || wynik_gospodarz < wynik_gosc) && typ == "12")
	)
	{
		return true;
	}
	else
	{
		return false;
	}
}
2

Każde:

if(x) return true; 
else return false;

skraca się do:

return x;

Dodatkowo niektóre pary sprawdzań możesz zastąpić jednym.

public static bool zwroc_wynik( int wynik_gospodarz, int wynik_gosc, string typ)
{
return 
        (wynik_gospodarz > wynik_gosc && typ == "1") ||
        (wynik_gospodarz == wynik_gosc && typ == "0") ||
        (wynik_gosc > wynik_gospodarz && typ == "2") ||
        ((wynik_gospodarz >= wynik_gosc) && typ == "10") ||
        ((wynik_gosc >= wynik_gospodarz) && typ == "02") ||
        ((wynik_gosc != wynik_gospodarz) && typ == "12");
}
1

Zdefiniuj sobie funkcje result

int result(wynik.gospodarz, wynik.gosc){
  if (wynik.gospodarz == wynik.gosc){
    return 0
  }
  else {
    wynik.gospodarz > wynik.gosc ? (return 1) : (return 2)  //nie piszę w javie nie wiem czy to legitne
  }
}

i sprawdź za pomocą jakiejś funkcji czy w stringu typ zawiera się wynik funkcji (contains albo coś w tym stylu - powinno takie coś być w Javie(?))

13

najprosciej chyba

public static bool zwroc_wynik2(int wynik_gospodarz, int wynik_gosc, string typ)
{
	switch(typ)
	{
		case "1": return wynik_gospodarz > wynik_gosc;
		case "0": return wynik_gospodarz == wynik_gosc;
		case "2": return wynik_gospodarz < wynik_gosc;
		case "10": return wynik_gospodarz >= wynik_gosc;
		case "02": return wynik_gospodarz <= wynik_gosc;
		case "12": return wynik_gospodarz != wynik_gosc;
		default: return false;
	}
}
1

Kolejna mutacja: (nie znam C#)

 public static bool zwroc_wynik2(int wynik_gospodarz, int wynik_gosc, string typ)
 {
    int sign = Math.Sign(wynik_gospodarz.CompareTo(wynik_gosc)); 
    switch(typ)
    {
        case "1": return sign == 1;
        case "0": return sign == 0;
        case "2": return sign == -1;
        case "10": return sign >= 0;
        case "02": return sign <= 0;
        case "12": return sign != 0;
        default: return false;
    }
 }
1
public static bool zwroc_wynik(int wynik_gospodarz, int wynik_gosc, string typ)
        {
            var fn = new Dictionary<string, Func<int, int, bool>>
            {
                { "1", (a, b) => a > b },
                { "0", (a, b) => a == b },
                { "2", (a, b) => a < b },
                { "10", (a, b) => a >= b },
                { "02", (a, b) => a <= b },
                { "12", (a, b) => a != b }
            };

            return fn.ContainsKey(typ) && fn[typ](wynik_gospodarz, wynik_gosc);
        }
3

Nie chce mi się za bardzo szukać metod C#, więc wrzucę JS - może ktoś przepisze na C#:

function isWinningTicket(host, guest, bet) {
  const resultCode = host > guest ? '1' : (host < guest ? '2' : '0')

  return bet.includes(resultCode)
}

Ot cała filozofia ;)


Edit:
chyba poprawna wersja C#

public static bool IsWinningTicket(int host, int guest, string bet)
{
  var resultCode = host > guest ? "1" : (host < guest ? "2" : "0");
 
  return bet.Contains(resultCode);
}
2

w takim razie dla chcacych oszczedzic klawiature

static bool W(int h,int g,string b)=>b.Contains(h>g?"1":h<g?"2":"0");

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