Lorsque vous avez besoin du moins de pièces mobiles
Le programme MINUM le plus simple (voir plus d'échantillons de code ci-dessous):
public class Main {
public static void main ( String [] args ) {
var minum = FullSystem . initialize ();
var wf = minum . getWebFramework ();
wf . registerPath ( GET , "" ,
r -> Response . htmlOk ( "<p>Hi there world!</p>" ));
minum . block ();
}
}Ce framework Web, "MINUM", fournit une base minimaliste à pleine puissance pour une application Web. Pour TDD, par TDD.
make test_coverage )make mutation_test )La minum est de cinq mille lignes de code - les concurrents "minimalistes" varient de 400 000 à 700 000 lignes lorsqu'ils tiennent compte de leurs dépendances. Je n'ai pas trouvé de projet similaire.
L'application d'une approche minimaliste permet un débogage, une maintenabilité plus facile et une baisse des coûts globaux. La plupart des cadres négocient un démarrage plus rapide pour un coût global plus élevé. Si vous avez besoin d'une qualité durable, le logiciel doit être bien testé et documenté dès le début. À titre d'exemple, la capacité de ce projet à atteindre une couverture de test aussi élevée a été grandement rendue par le paradigme minimalisme.
Il y a un démarrage rapide, ou si vous avez un peu plus de temps, pensez à essayer le tutoriel
< dependency >
< groupId >com.renomad</ groupId >
< artifactId >minum</ artifactId >
< version >8.0.5</ version >
</ dependency >Taille compilée: 200 kilobytes.
Lignes de code de production (y compris les dépendances requises)
| Minum | Javalin | Botte de printemps |
|---|---|---|
| 5 335 | 141 048 | 1 085 405 |
Voir les détails
Voir la comparaison des performances du cadre
Voir les liens suivants pour des exemples de projets qui utilisent ce cadre.
Le plus possible
Ce projet est utile pour voir l'application minimale possible qui peut être faite. Cela pourrait être un bon point de départ pour l'utilisation de MINUM sur un nouveau projet.
Exemple
Ceci est un bon exemple pour voir un projet de base avec diverses fonctionnalités. Il montre de nombreux cas d'utilisation typiques du cadre minimal.
Projet Memoria
Il s'agit d'un projet de famille. Il démontre le type d'approche que ce cadre est destiné à favoriser.
Instanciation d'une nouvelle base de données:
var db = new Db <>( foosDirectory , context , new Foo ());Ajout d'un nouvel objet à une base de données:
var foo = new Foo ( 0L , 42 , "blue" );
db . write ( foo ); Mise à jour d'un objet dans une base de données:
foo . setColor ( "orange" );
db . write ( foo ); Suppression d'une base de données:
db . delete ( foo ); Rédaction d'une déclaration de journal:
logger . logDebug (() -> "hello" );Analyse d'un document HTML:
List < HtmlParseNode > results = new HtmlParser (). parse ( "<p></p>" );Recherche d'un élément dans le graphique analysé:
HtmlParseNode node ;
List < HtmlParseNode > results = node . search ( TagName . P , Map . of ());Création d'un nouveau gestionnaire Web (une fonction qui gère une demande HTTP et renvoie une réponse):
public Response myHandler ( Request r ) {
return Response . htmlOk ( "<p>Hi world!</p>" );
}Enregistrement de ce point de terminaison:
webFramework . registerPath ( GET , "formentry" , sd :: formEntry );Construire et rendu un modèle:
TemplateProcessor foo = TemplateProcessor . buildProcessor ( "hello {{ name }}" );
String rendered = foo . renderTemplate ( Map . of ( "name" , "world" ));Obtenir un paramètre de requête à partir d'une demande:
String id = r . requestLine (). queryString (). get ( "id" );Obtenir un paramètre corporel à partir d'une demande, en tant que chaîne:
String personId = request . body (). asString ( "person_id" );Obtenez un paramètre de chemin à partir d'une demande en tant que chaîne:
Pattern requestRegex = Pattern . compile ( ".well-known/acme-challenge/(?<challengeValue>.*$)" );
final var challengeMatcher = requestRegex . matcher ( request . requestLine (). getPathDetails (). isolatedPath ());
// When the find command is run, it changes state so we can search by matching group
if (! challengeMatcher . find ()) {
return new Response ( StatusLine . StatusCode . CODE_400_BAD_REQUEST );
}
String tokenFileName = challengeMatcher . group ( "challengeValue" );Obtenir un paramètre corporel à partir d'une demande, en tant que tableau d'octets:
byte [] photoBytes = body . asBytes ( "image_uploads" );Vérification d'un message journal pendant les tests:
assertTrue ( logger . doesMessageExist ( "Bad path requested at readFile: ../testingreadfile.txt" ));