คุณมีห้องสมุด 'misc utils' ของคุณเองหรือไม่? ส่วนไหนที่คุณภูมิใจมากที่สุด [ปิด]


32

ฉันรู้ว่าพวกเราหลายคนรักษาห้องสมุดส่วนตัวเล็ก ๆ ของเราเองด้วยเครื่องมือและโปรแกรมอรรถประโยชน์ที่เราใช้บ่อย ๆ

ฉันมีของฉันตั้งแต่ฉันอายุ 16 ปีดังนั้นมันจึงมีขนาดค่อนข้างใหญ่ บางสิ่งที่ฉันเขียนได้ถูกเพิ่มลงในเฟรมเวิร์ก ฉันเขียนการนำต้นไม้แสดงออกมาใช้เล็กน้อยเพื่อใช้กับอัลกอริธึมทางพันธุกรรมมานานก่อน LINQ ซึ่งฉันค่อนข้างชอบและภูมิใจในเวลานั้นแน่นอนว่ามันไร้ประโยชน์อย่างแน่นอน แต่เมื่อเร็ว ๆ นี้ฉันได้ผ่านมันไปแล้วและอัปเกรดเป็น. NET 4.0 และกระตุ้นความสนใจอีกครั้ง

ดังนั้นฉันอยากรู้ว่าคุณใช้ห้องสมุดของคุณเพื่ออะไร บางทีเราอาจได้ไอเดียเจ๋ง ๆ บางอย่างมาเพื่อตัวอย่างเล็ก ๆ น้อย ๆ ที่มีประโยชน์และแบ่งปันกับพวกเรา

ดังนั้นคำถามของฉันคือ:

  • คุณมีห้องสมุดสาธารณูปโภคอื่น ๆ หรือไม่?
  • ส่วนไหนที่คุณภูมิใจมากที่สุดและเพราะอะไร

ยกตัวอย่างรหัสถ้าคุณชอบ :-)


ดูเหมือนว่าไม่มีใครตอบคำถามได้หมด ...
Joey Adams

@ Joey Adams ใช่มั้ย ปัจจุบัน 17 คะแนนโหวตคำถามและ 6 รวมคะแนนโหวตคำตอบ
Nicole

ฉันไม่เห็นคำตอบที่ควรค่าสำหรับการเลื่อน upvote มีความหมายต่อพวกเขาอย่างไร ลักษณะของคำถามเป็นเช่นนั้นคำตอบที่ได้รับเพียง "โอ้ดี." ชนิดของปฏิกิริยาและจากนั้นก็สามารถลงคะแนนได้ทุกอย่างหรือไม่มีอะไรเลย (และฉันไม่ชอบการถอนคำตอบทุกคำตอบเพียงแค่ทำให้มันอยู่ตรงนั้นถ้าไม่มีอะไรฉันไม่ได้คะแนน: P)
อดัมเลียร์

@Anna Lear, ok, คุณขอโทษ :)
Nicole

3
ยูทิลิตี้ที่เหมาะสมใด ๆ ควรนำมาใช้กับ GitHub และแบ่งปันกับโลก มันไม่สมเหตุสมผลที่จะซ่อนมันไว้ถ้ามันดีจริงๆ
งาน

คำตอบ:


27

เลขที่

ฉันได้เห็นเอฟเฟกต์ที่น่าหวาดเสียวของนักพัฒนาโหลทั้งหมดที่เพิ่มไลบรารี่สไตล์ "util.h" ของตัวเองลงในโปรเจ็กต์ต่างๆ เหมือน PHP ดังนั้นฉันจึงหลีกเลี่ยงการทำเช่นนั้น

ฉันหลีกเลี่ยงไม่จำเป็นต้องทำโดยใช้สภาพแวดล้อมการเขียนโปรแกรมที่มอบเครื่องมือและไลบรารีเกือบทั้งหมดที่ฉันต้องการก่อนทุกครั้งที่ทำได้เช่น C # และ python


7
ฉันเขียนห้องสมุดของฉันตลอดเวลาเพื่อจุดประสงค์ขององค์กร
Maxpm

3
กรณีที่แพคเกจ utils ได้กลายเป็นฝันร้ายไม่ได้หมายความว่าทั้งหมดจะไม่ดี ฉันไม่เห็นวิธีที่คุณสามารถหลีกเลี่ยงได้และไม่มีการทำสำเนารหัสมากขึ้นเพราะเหตุใด ดังนั้นการทดสอบที่แย่ลงและประสิทธิภาพลดลง
Nicole

2
@Renesis: แพ็กเกจ utils เกี่ยวกับหายนะตามคำสั่ง goto แน่นอนว่าด้วยตัวของมันเองมันไม่ได้เลวร้ายอะไร แต่ดูเหมือนว่ามันจะกลายเป็นหายนะไม่ช้าก็เร็ว สำหรับการทำสำเนารหัสถ้าคุณพบว่าตัวเองทำงานคล้าย ๆ กันในโครงการแทบทั้งหมดของคุณแล้วสำหรับบางอย่างเช่นไพ ธ อนหรือ C # คนอื่นก็อาจจะทำเช่นกันและมันก็อาจจะอยู่ในไลบรารีมาตรฐานด้วย
whatsisname

6
จากประสบการณ์ของฉันวิศวกรที่มีห้องสมุดของตัวเองจะนิยมใช้มันก่อนระบบที่จัดให้ดังนั้นจึงไม่ใช่วิธีที่ดีที่จะมีห้องสมุดส่วนตัว ผมเคยมีผู้ชายคนหนึ่งที่เชื่ออย่างแน่นอนว่า 'strlen' ฟังก์ชั่นของเขาเป็นได้เร็วขึ้นกว่าคอมไพเลอร์ที่ให้หนึ่งเพราะเขาเขียนมัน เอาการสาธิตง่ายๆว่า strlen เป็นคู่ของคำแนะนำการประกอบแบบอินไลน์สำหรับเขาที่จะยอมรับว่าบางทีคนอื่นสามารถทำได้ดีกว่า
JBRWilkinson

4
@JBRWilkinson จุดของคุณถูกนำมาเป็นอย่างดี โปรแกรมเมอร์ทุกคนไม่เหมาะที่จะพัฒนารหัสทั่วไป
นิโคล

15

SmartFormat

ยูทิลิตี้ที่ฉันชอบคือตัวที่ฉันเขียน - ตัวสร้างสตริง / ตัวจัดรูปแบบง่ายๆที่ทำให้การแปลงข้อมูลเป็นสตริงด้วยไวยากรณ์ที่ถูกต้องเป็นเรื่องง่าย

ยกตัวอย่างเช่นโปรแกรมเมอร์ส่วนใหญ่สร้างข้อความจากแม่แบบ: แต่นำไปสู่การนี้เพื่อไวยากรณ์ผิดพลาด:"There are {0} items remaining" "There are 1 items remaining"

ดังนั้นSmartFormat"There {0:is|are} {0} item{0:|s} remaining"ช่วยให้คุณสามารถเขียน:

คุณเพียงแค่แทนที่String.Format(...)ด้วยSmart.Format(...)และนั่นคือ!

SmartFormatรหัสเปิดแหล่งที่มา: http://github.com/scottrippey/SmartFormat/wiki


java.text.MessageFormatนี้ทำให้ผมนึกถึงรูปแบบที่ใช้โดย
barjak

@barjak ที่น่าสนใจ! ฉันใช้เวลานานในการค้นคว้าการจัดรูปแบบ "มีเงื่อนไข" และไม่เคยพบอะไรที่คล้ายกันมาจนถึงตอนนี้! MessageFormatมีChoiceFormatชั้นเรียนที่ช่วยให้ไวยากรณ์ที่คล้ายกันอย่างแปลกใจ! "There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}."ตัวอย่างจากเอกสาร: ขอขอบคุณที่พูดถึงข้อมูลอ้างอิงนี้
Scott Rippey

@barjak เพียงเพื่อตรวจสอบจุดของฉัน แต่SmartFormatมีคุณสมบัติอื่น ๆ อีกมากมาย! การจัดรูปแบบตามเงื่อนไขทำงานได้กับชนิดข้อมูลใด ๆ เช่นบูลวันที่ช่วงเวลาและวัตถุ "{Count:<0?negative|=5?five|>50&<100?large|other}"ก็ยังสนับสนุนผู้ประกอบการขั้นสูงเช่น มีการสะท้อนภาพ (เช่น"There are {items.Length} items"สามารถจัดรูปแบบรายการอาเรย์และไทม์แพนได้นอกจากนี้ยังมีรูปแบบปลั๊กอินสำหรับรองรับคุณสมบัติอื่น ๆ อีกมากมาย
Scott Rippey

ดูเหมือนว่าจะมีประสิทธิภาพแน่นอน การจัดรูปแบบอาร์เรย์กำลังหยุดพัก
barjak

@barjak: ใช่การจัดรูปแบบอาร์เรย์มีประโยชน์จริง ๆ ! ตรวจสอบตัวอย่างนี้จะส่งผลให้Smart.Format("There are {0.Count} files: {0:'{}'|, |, and }.", files); "There are 3 files: 'a.txt', 'b.txt', and 'c.txt'."ฉันนึกภาพไม่ออก
Scott Rippey

7

K Combinator (C #, Scala)

ฉันใช้ K combinator ใน Ruby บ่อยครั้งส่วนใหญ่จะเป็นเท่าเมื่อการพับถูกดำเนินการผ่านผลข้างเคียงมากกว่าค่าตอบแทนเช่นในตัวอย่างนี้:

some_collection.reduce(Hash.new(0)) {|acc, el| acc[el] += 1 }

some_collectionข้อหานี้ความถี่ที่แต่ละองค์ประกอบที่เกิดขึ้นใน น่าเสียดายที่มันใช้งานไม่ได้เนื่องจากบล็อกต้องส่งคืนค่าใหม่ของตัวสะสมในแต่ละการวนซ้ำ แต่ในการกำหนดค่า Ruby จะประเมินค่าที่ได้รับมอบหมาย

ดังนั้นคุณต้องส่งคืนค่าใหม่ของแอคคูมูเลเตอร์ดังนี้:

some_collection.reduce(Hash.new(0)) {|acc, el| acc[el] += 1; acc }

แต่ฉันพบว่าการเรียงลำดับอย่างชัดเจนน่าเกลียดในสไตล์ฟังก์ชั่น - อิชนี้โดยใช้การพับ K combinator (เรียกว่าObject#tapRuby) ช่วยเหลือ:

some_collection.reduce(Hash.new(0)) {|acc, el| acc.tap { acc[el] += 1 }}

ฉันพลาดไปแล้วสองสามครั้งใน C # (ส่วนใหญ่เป็นเพราะเหตุผลบางอย่างในการรวบรวมคอลเลกชันเช่นการList.Addส่งคืนvoidแทนthis) และ Scala ดังนั้นฉันจึงพกพาสิ่งนี้:

namespace GenericExtensions
{
    public static class GenericExtensions
    {
        public static T Tap<T>(this T o, Action<T> f)
        {
            Contract.Requires(o != null);
            Contract.Requires(f != null);

            f(o);
            return o;
        }

        public static T Tap<T>(this T o, Action f)
        {
            Contract.Requires(o != null);
            Contract.Requires(f != null);

            f();
            return o;
        }
    }
}

และในสกาลา:

class Tap[T](o: T) {
  def tap(f: T => Unit) = { f(o); o }
  def tap(f: => Unit) = { f; o }
}

object Implicits { implicit def any2Tap[T](o: T) = new Tap(o) }

ฟังก์ชั่นเอกลักษณ์ (ทับทิม)

บางสิ่งที่ฉันขาดไปใน Ruby เป็นวิธีการเข้าถึงฟังก์ชั่นระบุตัวตน Haskell มีฟังก์ชั่นตัวตนภายใต้ชื่อid, Scala identityภายใต้ชื่อ สิ่งนี้อนุญาตให้หนึ่งเขียนโค้ดเช่น:

someCollection.groupBy(identity)

เทียบเท่าในทับทิมคือ

some_collection.group_by {|x| x }

ลิ้นไม่ได้ไหลออกมาใช่มั้ย

การแก้ไขคือ

IDENTITY = -> x { x }

some_collection.group_by(&IDENTITY)

ForEach (.NET)

อีกวิธีที่ขาดหายไปอย่างมากใน C #:

namespace IEnumerableExtensions
{
    public static class IEnumerableExtensions
    {
        public static void ForEach<T>(this IEnumerable<T> xs, Action<T> f)
        {
            Contract.Requires(xs != null);
            Contract.Requires(f != null);

           foreach (var x in xs) f(x);
        }
    }
}

3
ฉันคิดว่าตัวอย่างสุดท้ายของคุณคือการตัดสินใจออกแบบที่คำนวณได้ แนวคิดเกี่ยวกับผลActionข้างเคียงซึ่งขัดกับหลักการออกแบบของ LINQ
ChaosPandion

1
@ChaosPandion: สิ่งนี้เกี่ยวข้องกับ LINQ อย่างไร
Jörg W Mittag

@ Jörg W Mittag - IEnumerableส่วนขยายถูกเพิ่มสำหรับ LINQ
ChaosPandion

2
@ChaosPandion: ฉันยังไม่เข้าใจ ForEachไม่ใช่ตัวดำเนินการ LINQ เหตุใดจึงควรมีข้อ จำกัด ที่ใช้กับตัวดำเนินการ LINQ ForEachเท่านั้นซึ่งไม่ใช่ตัวดำเนินการ LINQ และทำไมต้องห้ามผลข้างเคียงIEnumerable.ForEachแต่อนุญาตสำหรับList.ForEach? นอกจากนี้ทำไมถึงมีผลข้างเคียงที่ต้องห้ามIEnumerable.ForEachแต่อนุญาตให้ทำforeach?
Jörg W Mittag

@ Jörg W Mittag - สิ่งที่ฉันพูดคือความจริงที่ว่ามันหายไปจากส่วนขยายคือการตัดสินใจออกแบบ ความจริงที่ว่าList<T>มีForEachเหตุผลพิจารณาว่าเป็นประเภทที่ไม่แน่นอน
ChaosPandion

6

ฉันมีตัวแปลงประเภท Java มันมีลายเซ็นสาธารณะ

public static <T> T convert(Object sourceValue, Class<T> destinationType)

และมันจะดีที่สุดในการแปลงค่าแหล่งที่มาเป็นประเภทปลายทาง มันช่วยให้คุณทำการพิมพ์แบบไดนามิกในภาษาที่พิมพ์แบบคงที่ :-)

มันมีประโยชน์จริง ๆ กับประเภทตัวเลขชนิดบรรจุกล่อง วิธีการระคายเคืองมันคือการที่คุณไม่สามารถนำIntegerไปยังที่ที่Longคาดว่า? ไม่มีปัญหาเพียงแค่แปลง หรือเกิดอะไรขึ้นถ้าฟังก์ชั่นของคุณคาดหวังdoubleแต่คุณต้องnullใส่ที่นั่น? Kaboom, NPE แต่ใส่มันผ่านและคุณจะได้รับconvertNaN


ทางออกที่น่าสนใจ ฉันมักจะคิดเสมอว่า Long ควรขยายจำนวนเต็ม แต่ถึงอย่างนั้นคุณก็ยังคงมีปัญหาเกี่ยวกับการล็อคอัตโนมัติ (เท่าที่ฉันรู้ว่าไม่มีวิธีการล็อคอัตโนมัติที่จะทำงานร่วมกับการสืบทอด) นอกจากนี้ +1 ที่ให้NaNการสนับสนุน
นิโคล

NaNเป็นเลิศ น่าเสียดายที่ไม่มีสิ่งดังกล่าวสำหรับจำนวนเต็ม ฉันใช้Integer.MIN_VALUEเป็นแบบแผน ก็มักจะ "พอแปลก" ที่จะสังเกตเห็นแตกต่างจากค่าเริ่มต้น 0. ผมไม่ทราบว่าทำไมอัตโนมัติ (UN) มวยไม่รักษาเป็น(Double) null NaNมันเป็นทางออกที่ถูกต้องชัดเจน IMHO
Joonas Pulakka

6

ของรหัสอื่น ๆ ที่ฉันได้เขียนสิ่งที่ดีที่สุดอยู่ในCCANในขณะที่คนอื่น ๆ ฉันมักจะหารุ่นที่ดีกว่าของโครงการโอเพ่นซอร์สที่มีอยู่ ฉันพบว่าตัวเองกำลังเขียนโค้ด "misc" ที่ใช้งานทั่วไปน้อยลงเรื่อย ๆ ในปัจจุบันเพื่อเขียนโค้ดเฉพาะแอปพลิเคชันของรหัสดังกล่าวหรือเขียนโมดูลที่มีวัตถุประสงค์ทั่วไปที่ฉันสามารถปล่อยด้วยตนเอง

C

นี่คือฟังก์ชั่นและ typedef ฉันใช้มากกว่าหนึ่งครั้ง สำหรับแอปพลิเคชันที่ต้องการเวลามันยากที่จะเอาชนะมิลลิวินาทีในแง่ของความเรียบง่าย:

#include <stdint.h>
#include <sys/time.h>

typedef int64_t msec_t;

static msec_t time_ms(void)
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return (msec_t)tv.tv_sec * 1000 + tv.tv_usec / 1000;
}

และฟังก์ชั่นเบ็ดเตล็ดอื่น ๆ อีกมากมายที่ฉันมักจะใช้บ่อย ๆ (และมากกว่า):

/* Remove a trailing newline, if present. */
void chomp(char *buffer)
{
    if (!*buffer)
        return;

    while (*buffer)
        buffer++;

    if (buffer[-1] == '\n')
        buffer[-1] = 0;
}

/*
 * Skip whitespace, update the pointer, and return it.
 * Example:
 *
 * switch (*skipSpace(&s)) {
 *     case '\0':
 *         ...
 *     case '(':
 *         ...
 */
const char *skipSpace(const char **sptr)
{
    const char *s = *sptr;
    while (isspace(*s))
        s++;
    *sptr = s;
    return s;
}

/* Scramble an array of items uniformly. */
void scramble(void *base, size_t nmemb, size_t size)
{
    char *i = base;
    char *o;
    size_t sd;
    for (;nmemb>1;nmemb--) {
        o = i + size*(rand()%nmemb);
        for (sd=size;sd--;) {
            char tmp = *o;
            *o++ = *i;
            *i++ = tmp;
        }
    }
}

Haskell

nub :: (Eq a) => [a] -> [a]ฟังก์ชั่นของ Haskell คือ O (n²) เพราะด้วยลายเซ็นประเภทของมันอนุญาตให้ทดสอบว่าองค์ประกอบสองอย่างนั้นเท่ากันหรือไม่ ทางเลือก O (n log n) แบบง่าย ๆ คือmap head . group . sortแต่ต้องการบังคับให้รายการอินพุตทั้งหมดก่อนที่จะสร้างเอาต์พุตในขณะที่nubสามารถเริ่มต้นสร้างเอาต์พุตได้ทันที ต่อไปนี้เป็นทางเลือก O (n log n) nubที่รวบรวมรายการที่เห็นอยู่แล้วในData.Set:

module Nub (nub') where

import Prelude
import Data.Set (empty, member, insert)

nub' :: Ord a => [a] -> [a]
nub' xs = loop xs empty where
    loop [] _ = []
    loop (x:xs) set =
        if x `member` set
            then loop xs set
            else x : loop xs (insert x set)

ใน Haskell ผมใช้ทางเลือกในการsequence, mapM, forM, และreplicateM filterMการกระทำเหล่านี้แต่ละรายการจะสร้าง แต่ไม่สามารถใช้รายการได้จนกว่าการกระทำจะเสร็จสมบูรณ์ทั้งหมด (ถ้าคุณใช้ monad ที่เข้มงวดเช่น IO) ทางเลือกสร้างรายการในสิ่งที่ตรงกันข้ามแทนที่จะสร้างหอคอยแห่ง Thunks ที่ฉันพบผ่านการเปรียบเทียบเพื่อให้เร็วขึ้นอย่างน้อยด้วย GHC

sequence' :: Monad m => [m a] -> m [a]
sequence' ms = loop ms [] >>= return . reverse where
    loop []     xs = return xs
    loop (m:ms) xs = do
        x <- m
        loop ms (x:xs)

mapM' :: Monad m => (a -> m b) -> [a] -> m [b]
mapM' f xs = sequence' $ map f xs

forM' :: Monad m => [a] -> (a -> m b) -> m [b]
forM' = flip mapM'

replicateM' :: Monad m => Int -> m a -> m [a]
replicateM' n x = sequence' (replicate n x)

filterM' :: Monad m => (a -> m Bool) -> [a] -> m [a]
filterM' pred xs = loop xs [] >>= return . reverse where
    loop []     xs' = return xs'
    loop (x:xs) xs' = do
        keep <- pred x
        loop xs (if keep then (x:xs') else xs')

หมายเหตุ: sequence_, mapM_, forM_และreplicateM_ฟังก์ชั่นยังคงเป็นทางเลือกที่ดีกว่าถ้าคุณไม่ได้สนใจในรายการผลลัพธ์


+1 สำหรับ ccan แม้ว่าฉันจะได้รับการพิจารณาเป็นบิตลำเอียง :)
ทิมโพสต์

4

ฉันเลิกใช้การแยก / เข้าร่วม ala Perl ในภาษาที่ไม่มี

ฉันยังได้ปรับปรุง Atoi และ itoa อีกครั้งใน C มากกว่าที่ฉันต้องการคิด (ขยะระบบฝังตัว)


4

เลขที่

ฉันทำการเข้ารหัสส่วนใหญ่ใน Java และแนวทางปฏิบัติที่ดีที่สุดคือการนำ "utils" จากไลบรารี Apache Commons และโครงการที่คล้ายกันกลับมาใช้ใหม่

หากคุณมีวัตถุประสงค์เกี่ยวกับเรื่องนี้มีบางกรณีที่การรวบรวม "utils" ของคุณเองจะเป็นการปรับปรุงที่สำคัญในสิ่งที่คนอื่น ๆ ได้ทำไปแล้ว และหากยังไม่ได้รับการปรับปรุงห้องสมุดของคุณอาจเสียเวลาในการพัฒนาและสร้างความรำคาญให้กับผู้ดูแลในอนาคต


3

ฉันมีการเปลี่ยนแปลงวันที่ที่ฉันแสดงโดยใช้ Java จากนั้นฉันก็เริ่มใช้JodaTimeเพราะฉันได้ยินสิ่งที่ดีเกี่ยวกับมันและมันจะรวมอยู่ใน Java 7 (ไม่แน่ใจว่านี่ยังเป็นกรณีนี้อยู่หรือไม่ คุ้มค่ากับการใช้มัน)

มันเปลี่ยนคลาส 50+ ให้เป็นหนึ่งบรรทัดด้วยการเรียกใช้เมธอดที่ถูกโยง

สำหรับการอยากรู้อยากเห็นมันเกี่ยวข้องกับการได้รับวันที่ในแต่ละวันของnสัปดาห์ที่ผ่านมา: เช่นตัวเลขยอดขายวันจันทร์ที่ 10 สัปดาห์ที่ผ่านมา ฯลฯ ฯลฯ )

และนี่คือส่วนหนึ่งของมัน

public static DateTime getDayPreviousWeek(DateTime dt, DayOfWeek dayOfWeek, int n_weeks) {
       return dt.minusWeeks(n_weeks).dayOfWeek().setCopy(dayOfWeek.getDayAsString());
}

java มีวิธีการขยาย?
Kugel

ไม่ แต่ฉันคิดว่ามันอาจจะทำให้พวกเขาได้ในเวอร์ชั่น 7
NimChimpsky

2

ฉันมักจะมีutilsแพคเกจบางประเภทแม้กระทั่งใน Java แต่คอลเลกชัน utils PHP ของฉันคือการใช้มากที่สุด มีหลายไลบรารีที่ดีใน Java ที่ฉันอาจมีห้องสมุดรวมอยู่ในโครงการหรือต้องการออกแบบอุปกรณ์ที่ขาดหายไปด้วยตัวเอง ห้องสมุด PHP มีแนวโน้มที่จะทำมากเกินไปสำหรับฉันที่จะรวมไว้ในโครงการของฉัน

ฉันชอบฟังก์ชั่นนี้สำหรับ PHP กลั่นด้วยความช่วยเหลือใน StackOverflow ...

function getValueFromDotKey(&$context, $name) {
    $pieces = explode('.', $name);
    foreach ($pieces as $piece) {
        if (!is_array($context) || !array_key_exists($piece, $context)) {
            // error occurred
            return null;
        }
        $context = &$context[$piece];
    }
    return $context;
}

มันคล้ายกับ BeanUtils ของ Apache สำหรับ Java และฉันใช้เพื่อจุดประสงค์ที่คล้ายคลึงกันโดยให้องค์ประกอบแบบฟอร์มในภาษาเทมเพลตเป็นคีย์เดียวที่สามารถรับ / ตั้งค่าที่ซ้อนกันในอาเรย์อาร์เรย์:

$source = array('a' => array('b' => 5));

$val = getValueFromDotKey($source, 'a.b');

แน่นอนเป็น PHP, ผมอยากจะให้วิธีการที่มีน้ำหนักเบาที่สุดเท่าที่จะเป็นไปได้ดังนั้นจึงไม่ค่อนข้างเป็น featureful เป็น BeanUtils;)


2

ห้องสมุดมาตรฐานของสกาล่าขาดฟังก์ชั่นการสั่งซื้อที่สูงขึ้นบางส่วน

ฟังก์ชั่นสองอย่างที่ฉันต้องการบ่อยที่สุด:

// #1: unfold
def unfold[T, R](init: T)(f: T => Option[(R, T)]): List[R] = f(init) match {
  case None => Nil
  case Some(r, v) => r :: unfold(v)(f)
}

// #2: zipWith
def zipWith[A, B, C](xs: List[A], ys: List[B])(f: (A, B) => C): List[C] = {
  (xs, ys).zipped.map(f)
}

1

ปัจจุบันไม่มี ฉันมีหนึ่งเมื่อฉันทำ C แต่ตอนนี้ที่ฉันทำ Java มันไม่เหมาะสมเมื่อพิจารณา libs มาตรฐานทั้งหมดที่มีอยู่รวมทั้งสารพัดทั้งหมดที่มาจากโครงการ Apache

หนึ่งในสิ่งที่มีประโยชน์ใน C lib ของฉันคือการใช้งานเครื่อง จำกัด อย่างรวดเร็ว & สกปรกซึ่งอนุญาตให้นิยามของเครื่องสถานะ จำกัด ที่มีเพียงสองสายและอาร์เรย์ของสตริง มันสามารถใช้ในการตรวจสอบสตริงกับกฎ (เช่น "ต้องมีความยาว 4..6 ตัวอักษรตัวแรกตัวอักษรตัวที่เหลือ") แต่ความพร้อมใช้งานของ regexes ทำให้สิ่งนั้นไม่มีจุดหมายอย่างสมบูรณ์


1

ฉันสามารถ UIs สก์ท็อปไม่ได้เขียนตอนนี้ไม่มีข้อความโต้ตอบแบบไดนามิกบนพื้นฐานของการดำเนินการที่แตกต่างกัน มันเป็นแฮ็คที่ฉันสะดุดเมื่อประมาณปี 1985 และฉันได้นำมันไปใช้ในหลาย ๆ ภาษามากกว่าที่ฉันจำได้


1

ฉันพบว่าฉันกำลังเขียนรหัสเดียวกันจำนวนมากใน django ทำสิ่งนี้ร่วมกันจากนั้นเป็นสิ่งทั่วไปและในที่สุดสิ่งนั้น โดยทั่วไปได้รับหนึ่งรายการจากฐานข้อมูลหรือบันทึกผลลัพธ์ของแบบฟอร์ม

หากสิ่งเหล่านี้แต่ละอย่างเกิดขึ้นเพียงครั้งเดียวในมุมมองจากนั้นฉันสามารถใช้มุมมองทั่วไป django น่าเสียดายที่มันไม่ได้เรียงกันได้จริง ๆ และฉันต้องทำหลาย ๆ อย่างตามลำดับ

ดังนั้นฉันจึงไปและเขียนไลบรารีมุมมองที่กว้างกว่าเดิมอันที่ทำงานโดยการสร้างรายการการกระทำจากชุดการสืบค้นที่เกี่ยวข้อง (หรืออะไรก็ตาม) ก่อนจากนั้นจึงรวมรายการไว้ในมุมมอง

ฉันยังคงต้องเขียนบางมุมมองด้วยมือ แต่โดยทั่วไปมักจะซับซ้อนพอที่จะมีไม่มากที่สามารถใช้ซ้ำได้ หม้อไอน้ำสำเร็จรูปทั้งหมดเพิ่งไปที่อื่นไม่ว่าจะเป็นมุมมองทั่วไปหรือเป็นมุมมองมัณฑนากร โดยทั่วไปแล้วตัวจัดการที่ฉันเขียนจะประมาณ 10% เนื่องจากตัวจัดการทั่วไปบางตัวสามารถทำทุกอย่างได้


1

ใช่ แต่สำหรับโครงสร้างของสำนวนเฉพาะโดเมน (เช่นคอนเทนเนอร์ของเกมเฉพาะวัตถุ)

เนื่องจากเป็นเครื่องมืออรรถประโยชน์ที่เรียบง่ายกว่าสิ่งที่ซับซ้อนฉันจึงไม่ภูมิใจในสิ่งใดที่นั่น ฉันเป็นผู้ใช้ที่ไม่ซ้ำกันในขณะนี้ดังนั้นจึงไม่มีอะไรน่าภาคภูมิใจ


1

การจัดเรียงทางอ้อม C ++ ขึ้นอยู่กับ STL sortและเทมเพลต functor

ความต้องการจัดเรียงทางอ้อม (ซึ่งผลลัพธ์ที่ต้องการคือดัชนีเรียงสับเปลี่ยนที่จะเป็นผลมาจากการเรียงลำดับข้อมูล แต่ไม่ใช่เรียงลำดับข้อมูล ) ปรากฏหลายครั้งในหลายโครงการ ฉันสงสัยอยู่เสมอว่าทำไม STL ไม่ได้ให้บริการในการดำเนินการ

อีกอันหนึ่งคือเวกเตอร์ไซคลิก C ++ โดยที่ดัชนีบวกและลบเป็นโมดูโลที่มีขนาดเวกเตอร์ (เพื่อให้ค่าจำนวนเต็มใด ๆ เป็นดัชนีที่ถูกต้องสำหรับเวกเตอร์)


-4

ฉันเขียนแพ็คเกจ utils ขนาดเล็กเมื่อฉันทำการพัฒนา Java ในคอมพ์ของฉัน วิชาวิทย์ในโรงเรียนมัธยม ฉันภูมิใจในตัวสร้างตัวเลขสุ่มของฉันมากที่สุด

/**
* Returns a random integer.
*
* @returns    int    Random integer
*/
public static int getRandom()
{
    return 4; // Chosen by a fair dice roll.
              // Guaranteed to be random.
}

อุปกรณ์ประกอบฉากที่เป็นแรงบันดาลใจของฉัน


12
c'mon, xkcd ....
Darknight

2
C'mon มันไม่สำคัญ
Josh K

1
ด้วยคะแนนเสียงปัจจุบันของคุณที่ -2 ฉันคาดเดาว่ามันมีความสำคัญจริง ๆ ...
user7676

8
การลอกเลียนแบบเป็นคำเยินยอสูงสุดยกเว้นเมื่อเห็นได้ชัด
Maxpm

5
ปุ่ม downvote บอกว่า: "คำตอบนี้ไม่เป็นประโยชน์" ฉันเดาว่ามีความต้องการปุ่มเพิ่มเติม: "... แต่แน่ใจว่าเป็นเรื่องตลก"
skajfes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.