Si je lis correctement, vous parlez du problème posé par le motif Interpreter, mais sorte d'aller dans les deux directions.
Il existe des moyens simples d'obtenir de jolies interfaces génériques, pour que le reste du système fonctionne. Ma recommandation sur c'est quelque chose comme:
public interface Interpreter<OutputType> {
public void setCode(String coding);
public OutputType decode(String formattedData);
public String encode(OutputType rawData); }
Cependant, il y a quelques obstacles avec des applications concrètes. Pour votre exemple de date, vous devrez peut-être traiter avec "09/09/09", "9 septembre 09", "Septembre 9th, 2009". Le premier "genre" de date est simple - les nombres et les symboles de séparation, mais l'un ou l'autre des deux autres est assez méchant. Honnêtement, faire quelque chose de totalement générique (qui pourrait déjà être mis en boîte) n'est probablement pas raisonnable, donc je recommande ce qui suit. Je l'attaquerais sur deux niveaux, dont le premier est assez simple avec regex et la chaîne de format: hacher la chaîne de données dans les choses qui vont devenir des données brutes. Vous fournissez quelque chose comme "D */M */YY" (ou "M */D *") pour le premier, "D * MMM YY" pour le second, et "Mm + D * e *, YYYY" pour le dernier, où vous avez défini dans vos données certains symboles réservés (D, M, Y, interprétations évidentes) et pour tous les types de données (* caractères multiples possibles, + sortie "pleine", e caractères étrangers définis) - ces symboles évidemment être spécifique à votre application. Ensuite, votre substance regex écraserait la chaîne, tout ce qui est associé à chaque caractère réservé dans les champs de données individuels, et enregistrerait la partie de la décoration (virgules, etc) dans une chaîne de mise en forme. Ce premier niveau peut être assez générique - chaque type de données (par exemple, date, coordonnée, adresse) a des symboles réservés (qui ne chevauchent aucun caractère de formatage), et tous les types de données ont des symboles partagés. Peut-être que l'interface interpréteur aurait également des méthodes public List<Character> reservedSymbols()
et , ou des champs peut-être garantis, de sorte que vous pouvez faire du diviseur une classe externe et transmettre les résultats.
Le deuxième niveau est moins facile, car il arrive à la partie qui ne peut pas être générique. Basé sur le format des symboles réservés, les champs individuels doivent savoir comment se présenter. À l'exemple de date, MM indiquerait le mois à imprimer comme (01, 02, ... 12), M * comme (1, 2, ... 12), MMM comme (JAN, FEB, ... DEC) , Mmm as (Jan, Fév, ... Dec), etc. Si votre entreprise a été quelque peu cohérente ou ne s'aventure pas trop loin des représentations standard, alors le codage à la main de chacune d'entre elles ne devrait pas être trop mauvais (et en fait, il y a probablement des moyens intelligents dans chaque type de données pour réduire le code répliqué). Mais je ne pense pas qu'il soit pratique de généraliser tout cela - je veux dire, représenter pratiquement quelque chose qui peut être présenté comme un nombre ou des caractères (comme des mois) ou des données entières qui peuvent être déduites à partir de données partielles.) ou comment obtenir des représentations tronquées à partir des données (par exemple, la troncature pour l'année est aux deux derniers chiffres vice et la plupart des nombres normaux tronquer à deux chiffres principaux) va probablement prendre aussi longtemps que l'écriture de ces cas, mais je suppose Imaginez des cas de votre application, le compromis pourrait en valoir la peine. La date est vraiment un exemple difficile, mais je peux certainement voir des choses tout aussi délicates à venir pour d'autres sortes de données.
Résumé:
est un visage -Il générique facile, vous pouvez mettre sur votre problème, de sorte que le reste de votre application peut être codé autour d'elle.
-il y a une analyse de premier passage assez simple et générique, avec des symboles réservés universels, puis des symboles réservés pour chaque type de données; assurez-vous que ceux-ci ne sont pas en collision avec des symboles qui apparaîtront dans le formatage
est une étape -Il y codage final un peu fastidieux pour des bits de données
question Nice, je aime particulièrement que vous le titre pour le cas général. – BCS
Merci à tous ceux qui ont offert des suggestions. Je me suis retrouvé avec une sorte de combinateur parser unique. Pas le plus élégant mais il fait le travail. La chaîne de format pour 38 ° 53 '55.133 "N, 77 ° 02' 15.691" W (aka DMS, ou degrés minutes secondes) a fini par $ lat {$ d {} ° $ m {} '$ s {places = 3} "$ h}, $ lon {$ d {} ° $ m {} '$ s {places = 3}" "$ h}. La chaîne pour 38.898648, -77.037692 (alias DD, ou degrés décimaux format à six endroits) fini $ lat {$ dd {places = 6 ~ showNegativeSign = true}}, $ lon {$ dd {places = 6 ~ showNegativeSign = true}} Et bien sûr, une myriade d'autres combinaisons sont possibles, ce que je recherchais. –