Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expose more detailed analysis of individual words #4

Merged
merged 2 commits into from
May 30, 2023

Conversation

mortterna
Copy link
Member

No description provided.

@mortterna mortterna requested a review from komu May 9, 2023 14:04
@komu komu changed the title Feature/word analysis Expose more detailed analysis of individual words May 17, 2023
@mortterna mortterna force-pushed the feature/word-analysis branch 4 times, most recently from 5f81c33 to 366f507 Compare May 23, 2023 10:56
} else {
throw new IllegalStateException("Error in trimming hyphens");
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tää vaikuttaa vähän epäilyttävältä. Jos ei muuten, niin ainakin nimeämiseltään, koska jotenkin nimen perusteella olettaisi että toteutus olisi ekvivalentti toString().replace("-", "") kanssa, mutta ilmeisesti näin ei ole.

Muutenkin, tuonne else-haaraanhan ei ole mahdollista mennä, mutta kääntäjä ei vain tajuta sitä koodin rakenteesta enkä minäkään ensin. Mitä jos toi olisikin:

if (s.isEmpty() || s.equals("-")) 
    return "";

int startOffset = startsWithChar(s, '-') ? 1 : 0;
int endOffset = endsWithChar(s, '-') ? 1 : 0;

return s.substring(startOffset, s.length() - endOffset);

Eikös tämä ole semantiikaltaan sama? Ainakin mulle kommunikoi paremmin mistä on kyse. Toi jopa on allokoinneiltaan identtinen, koska String.substring sisältää optimoinnin:

if (beginIndex == 0 && endIndex == length) {
    return this;
}

Muutenkin mietin tarvitseeko tuon olla rajapinnassa default-toteutuksena. Ei kai kellään rajapinnan toteuttajalla ole tarvetta overridetä sitä? Harkitsisin ihan vain jotain removeLeadingAndTrailing(s, '-') -funktiota. Tuollaisella funktiolle olisi helpompi kirjoittaa testitkin kun ei tule koko muuta roskaa mukana. Ja jos haluaa sen default-toteutuksen sinne rajapintaan, niin sekin voisi olla vain kutsu tuohon staattiseen funktioon.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kyseistä logiikkaa tarvitsee myös pluginin algoritmeissa, joissa käsitellään yhdyssanojen palasia, mutta sen verran pieni se on myös monistaa, joten ehkä se on parempi vain ottaa pois tästä rajapinnasta.

throw new IllegalStateException("Base form parts empty");

String result = baseFormParts[0];
baseFormParts = Arrays.copyOfRange(baseFormParts, 1, baseFormParts.length);
Copy link
Member

@komu komu May 30, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tää vähän sattuu muhun. Sen sijaan että allokoidaan ja kopioidaan, eikö voisi vain pitää indeksiä ensimmäiseen konsumoimattomaan baseFormiin. Eli olisi:

private int baseFormPartIndex = 0;

private @NotNull String popBaseForm() {
    if (isConsumed())
        throw new IllegalStateException("Base form parts empty");

    return baseFormParts[baseFormPartIndex++];
}

private boolean isConsumed() {
    return baseFormPartsIndex >= baseFormParts.length;
}

Tai jos ei halua noin matalan tason juttua, niin wrapata koko paska ArrayDeque-luokkaan ja kutsua sille removeFirst:iä. Se tekee sisäisesti saman jutun, että manipuloi vain indeksejä eikä kopioi mitään.


private boolean isNotConsumed() {
return !isConsumed();
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mä en tekisi omaa not-metodiaan vain yhden käyttökerran takia. Kyllä se if (! currentStrongMorpheme.isConsumed()) olisi ihan tarpeeksi selkeä. Itse asiassa sanoisin että se on jopa selkeämpi, koska tässä koodissa tulee korostuu selkeämmin se että eka ja toinen if-testaavat täsmälleen saman asian arvoja.

if (!currentStrongMorpheme.isConsumed()) {
    currentPart.addBaseForm(currentStrongMorpheme.popBaseForm());
    currentStrongMorpheme.addPart(currentPart.toWordPart());

    if (currentStrongMorpheme.isConsumed()) {
        wordParts.add(currentStrongMorpheme.toWordPart());
        currentStrongMorpheme.reset();
    }
}

@mortterna mortterna merged commit e27b799 into main May 30, 2023
@mortterna mortterna deleted the feature/word-analysis branch May 30, 2023 15:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants