4.2. شیء انبار
شیء انبار
یک انبار Nix مجموعهای از اشیای انبار است که میان آنها ارجاعاتی وجود دارد. یک شیء انبار شامل موارد زیر است:
یک شیء سیستمفایل به عنوان داده
مجموعهای از مسیرهای انبار به عنوان ارجاع به سایر اشیای انبار
ارجاعات
اشیای انبار میتوانند هم به سایر اشیای انبار و هم به خودشان ارجاع دهند. ارجاعات از یک شیء انبار به خودش، ارجاعات به خود (self-references) نامیده میشوند.
اشیای انبار و ارجاعات آنها یک گراف جهتدار تشکیل میدهند که در آن، اشیای انبار راسها و ارجاعات یالها هستند. بهطور خاص، یال مربوط به یک ارجاع از شیء انباری که حاوی آن ارجاع است شروع شده و به شیء انباری ختم میشود که مسیر انبار (یعنی همان ارجاع) به آن اشاره دارد.
ارجاعاتی غیر از ارجاع به خود نباید چرخهای (cycle) تشکیل دهند. بنابراین، گراف ارجاعات با احتساب عدم حضور ارجاعات به خود، یک [گراف جهتدار غیرمدور (DAG)] تشکیل میدهد.
ما میتوانیم [بستار متعددی (transitive closure)] گراف ارجاعات را به دست آوریم؛ در این گراف، اگر یک مسیر متشکل از یک یا چند ارجاع از شیء اول به شیء دوم وجود داشته باشد، هر جفت از اشیای انبار دارای یک یال خواهند بود. (یک ارجاع واحد همیشه مسیری به طول یک ارجاع میسازد، اما مسیرهای طولانیتر ممکن است اشیایی را که هیچ ارجاع مستقیمی بین آنها نیست به هم متصل کنند.) ملزومات (requisites) یک شیء انبار عبارتند از تمام اشیای انباری که از طریق مسیرهای ارجاعی قابل دستیابی هستند و با ارجاعات شیء انبار مشخصشده آغاز میشوند.
ما همچنین میتوانیم [گراف ترانهاده (transpose graph)] گراف ارجاعات را به دست آوریم، که در آن جهتگیری تمام یالها معکوس میشود. ارجاعدهندگان (referrers) یک شیء انبار، اشیای انباری هستند که به آن شیء ارجاع میدهند.
همچنین میتوان هر دو مفهوم را با هم ترکیب کرد: یعنی گرفتن بستار متعددیِ گراف ارجاعات ترانهادهشده. بستار ارجاعدهندگان (referrers closure) یک شیء انبار عبارت است از اشیای انباری که میتوانند از طریق مسیرهای ارجاعی به شیء انبار مورد نظر برسند.
نکته
باید دقت کرد که بین ویژگیهای ذاتی و بیرونی اشیای انبار تمایز قائل شویم. ما میتوانیم از اشیای موجود در یک انبار، گراف بسازیم، اما محتویات انبار بهطور کلی ثابت نیست و ممکن است در طول زمان تغییر کند.
ارجاعات یک شیء انبار — یعنی مجموعه مسیرهای انبار موسوم به ارجاعات — فیلدی از یک شیء انبار است و بنابراین طبق تعریف ذاتی محسوب میشود. صرفنظر از اینکه چه انباری حاوی شیء انبار مورد نظر است، و آن انبار ممکن است چه چیزهای دیگری را در خود داشته باشد یا نداشته باشد، ارجاعات ثابت و یکسان هستند.
ملزومات یک شیء انبار تقریباً ذاتی هستند — برخی از مسیرهای انبار دقیقاً به یک شیء انبار واحد و منحصربهفرد اشاره نمیکنند. اینکه دقیقاً چه شیء انباری مورد ارجاع قرار گرفته است، و متعاقباً ارجاعات خودِ آن چیست، به انبار مورد بحث بستگی دارد. انبارهای مختلف ممکن است بر سر اینکه یک مسیر انبار مشخص به چه چیزی اشاره دارد، اختلاف نظر داشته باشند.
ارجاعدهندگان یک شیء انبار کاملاً بیرونی هستند و صرفاً به انباری که حاوی آن شیء انبار است بستگی دارند، نه به خودِ شیء انبار. سایر اشیای انباری که به شیء انبار مورد نظر ارجاع میدهند ممکن است به انبار اضافه شده یا از آن حذف شوند.
تغییرناپذیری
اشیای انبار تغییرناپذیر هستند: پس از ایجاد، نه تغییر میکنند و نه هیچیک از اشیای انباری که به آنها ارجاع میدهند قابل تغییر است.
نکته
انبارهایی که از حذف اتمی چندین شیء انبار پشتیبانی میکنند، در عین حفظ این ویژگی، انعطافپذیری بیشتری را فراهم میآورند.
ویژگی بستار (Closure property)
یک انبار فقط در صورتی میتواند حاوی یک شیء انبار (store object) باشد که تمام اشیاء انباری را که به آنها ارجاع میدهد نیز در خود داشته باشد.
نکته
«ویژگی بستار» قرار نیست مثلاً مانع از بارگذاری تنبل (lazy loading) اشیاء انبار شود. با این حال، ترکیب «ویژگی بستار» و تغییرناپذیر (immutable) بودن دلالت بر این دارد که هرگونه بارگذاری تنبلی از این دست باید قطعی (deterministic) باشد.
فراداده شیء انبار
پیادهسازیهای انبار در حال حاضر اطلاعاتی فراتر از موارد ذکر شده در بالا را به یک شیء انبار متصل میکنند. کاملاً قابلبحث است که برخی از این اطلاعات نباید اینجا قرار گیرند، زیرا باعث ادغام و تداخل نگرانیها (responsibilities) میشوند. برای جزئیات، به فرمت JSON مربوط به اطلاعات شیء انبار یا فرمت narinfo مراجعه کنید.