เมื่อคุณต้องการชิ้นส่วนที่เคลื่อนไหวน้อยที่สุด
โปรแกรม minum ที่ง่ายที่สุด (ดูตัวอย่างรหัสเพิ่มเติมด้านล่าง):
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 ();
}
}เฟรมเวิร์กเว็บนี้ "Minum" ให้บริการมูลนิธิมินิมัลลิสต์เต็มรูปแบบสำหรับเว็บแอปพลิเคชัน สำหรับ TDD โดย TDD
make test_coverage )make mutation_test )Minum เป็นรหัสห้าพันบรรทัด - คู่แข่ง "มินิมัลลิสต์" มีตั้งแต่ 400,000 ถึง 700,000 บรรทัดเมื่อบัญชีสำหรับการพึ่งพาของพวกเขา ฉันไม่พบโครงการที่คล้ายกัน
การใช้วิธีการมินิมัลลิสต์ช่วยให้การดีบักการบำรุงรักษาได้ง่ายขึ้นและลดต้นทุนโดยรวม เฟรมเวิร์กส่วนใหญ่การค้าเริ่มต้นเร็วขึ้นสำหรับค่าใช้จ่ายโดยรวมที่สูงขึ้น หากคุณต้องการคุณภาพที่ยั่งยืนซอฟต์แวร์จะต้องได้รับการทดสอบอย่างดีและจัดทำเอกสารตั้งแต่เริ่มมีอาการ ตัวอย่างเช่นความสามารถของโครงการนี้ในการบรรลุความครอบคลุมการทดสอบที่สูงเช่นนี้ได้รับการเปิดใช้งานอย่างมากจากกระบวนทัศน์ที่เรียบง่าย
มีการเริ่มต้นอย่างรวดเร็วหรือถ้าคุณมีเวลาเพิ่มขึ้นอีกเล็กน้อยลองลองสอนการสอน
< dependency >
< groupId >com.renomad</ groupId >
< artifactId >minum</ artifactId >
< version >8.0.5</ version >
</ dependency >ขนาดที่รวบรวมได้: 200 กิโลไบต์
บรรทัดของรหัสการผลิต (รวมถึงการพึ่งพาที่ต้องการ)
| มินิม | จาวาลิน | รองเท้าสปริง |
|---|---|---|
| 5,335 | 141,048 | 1,085,405 |
ดูรายละเอียด
ดูการเปรียบเทียบประสิทธิภาพของเฟรมเวิร์ก
ดูลิงค์ต่อไปนี้สำหรับโครงการตัวอย่างที่ใช้เฟรมเวิร์กนี้
เล็กที่สุด
โครงการนี้มีค่าที่จะเห็นแอปพลิเคชันที่เป็นไปได้น้อยที่สุดที่สามารถทำได้ นี่อาจเป็นจุดเริ่มต้นที่ดีสำหรับการใช้ Minum ในโครงการใหม่
ตัวอย่าง
นี่เป็นตัวอย่างที่ดีในการดูโครงการพื้นฐานที่มีฟังก์ชั่นต่าง ๆ มันแสดงให้เห็นถึงกรณีการใช้งานทั่วไปของกรอบ Minum
โครงการ Memoria
นี่คือโครงการต้นไม้ครอบครัว มันแสดงให้เห็นถึงประเภทของวิธีการนี้มีไว้เพื่อส่งเสริม
อินสแตนซ์ฐานข้อมูลใหม่:
var db = new Db <>( foosDirectory , context , new Foo ());การเพิ่มวัตถุใหม่ในฐานข้อมูล:
var foo = new Foo ( 0L , 42 , "blue" );
db . write ( foo ); การอัปเดตวัตถุในฐานข้อมูล:
foo . setColor ( "orange" );
db . write ( foo ); การลบจากฐานข้อมูล:
db . delete ( foo ); การเขียนคำสั่งบันทึก:
logger . logDebug (() -> "hello" );แยกวิเคราะห์เอกสาร HTML:
List < HtmlParseNode > results = new HtmlParser (). parse ( "<p></p>" );ค้นหาองค์ประกอบในกราฟที่แยกวิเคราะห์:
HtmlParseNode node ;
List < HtmlParseNode > results = node . search ( TagName . P , Map . of ());การสร้างตัวจัดการเว็บใหม่ (ฟังก์ชั่นที่จัดการคำขอ HTTP และส่งคืนการตอบกลับ):
public Response myHandler ( Request r ) {
return Response . htmlOk ( "<p>Hi world!</p>" );
}การลงทะเบียนปลายทางนั้น:
webFramework . registerPath ( GET , "formentry" , sd :: formEntry );การสร้างและแสดงเทมเพลต:
TemplateProcessor foo = TemplateProcessor . buildProcessor ( "hello {{ name }}" );
String rendered = foo . renderTemplate ( Map . of ( "name" , "world" ));รับพารามิเตอร์แบบสอบถามจากคำขอ:
String id = r . requestLine (). queryString (). get ( "id" );รับพารามิเตอร์ร่างกายจากคำขอเป็นสตริง:
String personId = request . body (). asString ( "person_id" );รับพารามิเตอร์เส้นทางจากคำขอเป็นสตริง:
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" );รับพารามิเตอร์ร่างกายจากคำขอเป็นอาร์เรย์ไบต์:
byte [] photoBytes = body . asBytes ( "image_uploads" );ตรวจสอบข้อความบันทึกระหว่างการทดสอบ:
assertTrue ( logger . doesMessageExist ( "Bad path requested at readFile: ../testingreadfile.txt" ));