Kod powinien być przede wszystkim elastyczny i podatny na zmiany. Kod przejrzysty i łatwy do zrozumienia taki właśnie jest A to, że ma działać, to chyba oczywiste…
Według mnie kod łatwy do zrozumienia, to taki w którym od razu widać co do czego służy i co z czego wynika, od razu widać co i w jakiej kolejności dzieje się w programie, nie ma w nim niepotrzebnych instrukcji, jednym słowem - można go “ogarnąć” spoglądając na niego. A przejrzysty, to taki który komentuje się sam, w którym nazwy zmiennych mówią, do czego zmienne służą (czyli zazwyczaj mają więcej niż 1-2 znaki). Taki, w którym w jednej linijce nie ma dwudziestu instrukcji, czy wyrażeń.
Masz rację. Zasugerowałem się tym, czego chciał autor (a przynajmniej co zrozumiałem z jego pierwszego posta) - czyli programu, który podzieli tekst zaczynający się literą, w którym wyrazy porozdzielane są dokładnie jedną spacją. Taki kod napisałem… I działał. A w końcu działający miał być przede wszystkim, czyli to dobry kod, prawda? Ale skoro pojawia się konieczność, aby kod działał bez względu na liczbę spacji, to zawsze można rozbudować łatwy do zrozumienia i przejrzysty kod o kilka instrukcji, np. tak:
void strcpy(char zrodlo[], char parzyste[], char nieparz[])
{
int iz = 0, in = 0, ip = 0; //iteratory poszczególnych tablic
bool czyParzysty = false, bylaLitera = false; //pierwszy wyraz jest nieparzysty i nie wiemy, czy zrodlo zaczyna się literą
char poprzedni = 32; //zakładamy, że na indeksie -1 źródła jest spacja, bo jest to potrzebne do pierwszej iteracji
while(zrodlo[iz]) //dopóki nie natrafiliśmy na koniec łańcucha
{
//jeśli mamy do czynienia z literą albo spacją po wyrazie, to będziemy ją kopiować
if(zrodlo[iz] != 32 || (zrodlo[iz] == 32 && poprzedni != 32))
{
if(czyParzysty)
parzyste[ip++] = zrodlo[iz];
else
nieparz[in++] = zrodlo[iz];
bylaLitera = true; //zapamiętujemy, że trafiliśmy na literę
}
//zmiana parzystości wyrazu, o ile w łańcuchu były do tej pory jakieś litery
if(zrodlo[iz] == 32 && zrodlo[iz + 1] != 32 && bylaLitera)
czyParzysty = !czyParzysty;
poprzedni = zrodlo[iz];
iz++;
};
parzyste[ip] = 0; //tu koniec parzystych
nieparz[in] = 0; //a tu nieparzystych (żeby nie wyświetlało śmieci)
}
Pewno nie jest doskonały i da radę go jeszcze bardziej zoptymalizować.
Właśnie - zoptymalizować. Jest jeszcze jedna cecha dobrego kodu - wydajność. Wydawało mi się, że mój będzie wolniejszy od Twojego, no ale jak się okazuje, to w większości wypadków tak nie jest. Na dodatek im więcej spacji w tekście, tym mój jest szybszy. Czyżbym miał rację z tymi instrukcjami warunkowymi?
Zdaje mi się, że udowodniłem, że mój kod wcale taki znowu chłamowaty nie jest. A jeśli nie mam racji, to chętnie poczytam jakieś argumenty i dowód, że nie mam racji. Chętnie się czegoś nowego dowiem i nauczę.
P.S. Był tu już kiedyś taki, który tak samo, jak Ty miał wiedzę. Ale uważał przy tym, że jest najmądrzejszy i zawsze wszystko wie najlepiej, że zawsze ma rację, a nawet, że może wyrażać obiektywne osądy w subiektywnych kwestiach. Na dodatek nie trafiała do niego żadna argumentacja. Długo tu nie zagrzał, w ciągu paru miesięcy dorobił się bana, a teraz ponoć leczy kompleksy administrując forum z dwoma użytkownikami i dwoma postami.
Mam nadzieję, że nie podzielisz jego losu, bo szkoda byłoby stracić takiego eksperta.
Z poważaniem,
somekind