Apr 1, 2011

Nepoužívané triedy smrdia

Stovky tried, desiatky mených priestorov, triedy s podobným menom, niekoľkokrát prepísané triedy a nahradené novými. Manažmentom zrušené celé časti aplikácií hnijúce na miestach, ktoré developeri zďaleka obchádzajú? Je čas opäť upratať ten bordel v projekte.

Začnime s nepoužívanými triedami. Ako ich zistiť? PMD je na túto úlohu prikrátke — vie zistiť len nepoužívané privátne funkcie.

Jono Spiro, chalan ktorý kedysi pracoval na mxml kompilátore, navrhuje použiť nedokumentovaný parameter kompilatora --keep-generated-signatures spolu s -incremental parametrom. Tato kombinácia vygeneruje signatúry všetkých tried do adresára generated-signatures.

Signatúry sú súbory (*.sig) vytvorené z verejných tried, ktoré obsahujú zoznam funkcií, atribútov, importov, metadát atď. a ktoré môžu mať závislosti na iných triedach. Ak sa teda signatúra pre niektorú z tried nevygeneruje, trieda sa nepoužíva. Rozdielom zoznamu signatúr a zoznamu tried budú nepoužívané triedy:

import os, fnmatch

def find_files(path, patterns=(".txt",)):
    found = []

    for root, dirs, files in os.walk(path):
        for pattern in patterns:
            for filename in fnmatch.filter(files, pattern):
                relative_path = root.split(path)[1]
                found.append(os.path.join(relative_path, filename))

    return found

def find_unused_classes():

    all_sources = find_files(r'e:\path\to\src\\', ('*.as','*.mxml'))
    sources = (file.replace(os.sep, '_') for file in all_sources)
    signatures = find_files(r'e:\path\to\src\generated-signatures\\', ('*.sig',))

    diff = []

    for source in sources:
        splitted = source.split('.')
        transformed = splitted[0]

        if splitted[1] == 'mxml':
            transformed += '-generated.sig'
        else:
            transformed += '.sig'

        if transformed not in signatures:
            print '', source
            diff.append(source)

    return diff

garbage = find_unused_classes()

Blog comments powered by Disqus

About
Subscribe via RSS.