Shotnest · Bibliotheek
Vergelijk code zonder gelijk gedrag aan te nemen
Vergelijk twee codefragmenten in de teksttool van Shotnest en zie waarom if (count > 0) en if (count >= 0) toch 0,778 van hun tokens delen.
Wat de vergelijking met code doet
De vergelijkingstool zet beide invoeren in kleine letters, past dezelfde tekenomzetting toe die Shotnest bij het zoeken gebruikt (accenten weg, letters van volle breedte naar halve breedte), voegt elke reeks witruimte samen tot één spatie en splitst daarna op spaties. Hij meldt welk deel van de verschillende tokens de twee teksten gemeen hebben, plus de tokens die maar aan één kant voorkomen. Inspringing, regeleinden en hoofdletters verdwijnen vóór die stap; handig voor lopende tekst, riskant voor code.
Er wordt niets uitgevoerd. De pagina behandelt een geplakt fragment als platte tekst en toont het resultaat zonder het in opmaak om te zetten, dus de getallen beschrijven tekens, geen gedrag.
Bereid de twee fragmenten voor
- Plak elk fragment precies zoals het is vastgelegd, inclusief accolades en operatoren.
- Lees eerst de regel “Exact gelijk”; dat is de enige controle die hoofdletters en spaties behoudt.
- Lees daarna “Gelijk na normalisatie” en de overlapwaarde als losse feiten.
- Open de lijsten met tokens die alleen in de eerste of alleen in de tweede tekst staan; operatoren en vastzittende leestekens komen daar meestal tevoorschijn.
- Ga terug naar de screenshot voor alles wat de tokenlijsten niet kunnen tonen, zoals inspringing in een taal waar die betekenis heeft.
Twee fragmenten, één gewijzigde operator
Eerste tekst: “if (count > 0) { return count; }” verdeeld over drie regels. Tweede tekst: dezelfde opdracht op één regel met >= in plaats van >. Na normalisatie zijn de regeleinden weg, dus de enige verschillende tokens zijn > en >=. Zeven van de negen verschillende tokens zijn gedeeld, wat 7 ÷ 9 geeft.
- Exact gelijk
- Nee
- Gelijk na normalisatie
- Nee
- Woordoverlap
- 0,7777777777777778
- Alleen in de eerste tekst
- >
- Alleen in de tweede tekst
- >=
Een tweede paar laat het omgekeerde risico zien: “const Total = 1;” en “const total = 1;” worden als gelijk na normalisatie gemeld met overlap 1, hoewel veel programmeertalen Total en total als verschillende namen behandelen.
Fouten met codetekst
- Een overlap van bijna 1 opvatten als bewijs dat twee functies hetzelfde doen.
- De regel voor exacte gelijkheid overslaan en een hoofdletterwijziging in een identifier missen.
- Een fragment vergelijken waarvan de kopie via Livetekst een haakje kwijtraakte of twee kolommen samenvoegde.
- Verwachten dat de tool een gewijzigde vergelijkingsoperator als belangrijker aanmerkt dan een gewijzigd woord.
Waar de vergelijking ophoudt
Woordoverlap is een tekstmaat. Hij negeert volgorde, herhaalde tokens en witruimte, dus hij kan niet zeggen of de code compileert of dezelfde waarde teruggeeft. In de Shotnest-app komt een screenshot van code op de plank Code als drie of meer regels beginnen zoals code (import, def, return en dergelijke); die plank is om hem terug te vinden, en uitvoeren doe je in je eigen omgeving.