นี่เป็นสถานการณ์ที่ถูกต้องที่จะใช้ค่าคงที่หรือไม่?


42

ดังนั้นอาจารย์ของฉันก็ให้ความเห็นย้อนกลับในโครงการที่ฉันทำอยู่ เขาเชื่อมต่อสองสามคะแนนสำหรับรหัสนี้:

if (comboVendor.SelectedIndex == 0) {
  createVendor cv = new createVendor();
  cv.ShowDialog();
  loadVendors();
}

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

Create New Vendor...
Existing Vendor
Existing Vendor 2
Existing Vendor 3

ปัญหาของเขากับรหัสบรรทัดแรก:

if (comboVendor.SelectedIndex == 0)

เขาอ้างว่า 0 ควรเป็นค่าคงที่และทำเครื่องหมายให้ฉันจริงเพราะสิ่งนั้น เขาอ้างว่าฉันไม่ควรใช้ตัวอักษรในรหัสของฉันเลย

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


32
เขาเป็นคนดื้อรั้น โดยทั่วไปแล้วหมายเลขเวทย์มนตร์เป็นสิ่งที่ดีที่ควรหลีกเลี่ยง ฉันคิดว่า -1, 0 และ 1 ถือได้ว่าเป็นข้อยกเว้นสำหรับกฎนั้น นอกจากนี้ค่าคงที่เช่นนี้จะไม่ใช้พื้นที่มากขึ้นกว่าตัวอักษร 0
Dave Mooney

23
@DaveMooney: คุณแน่ใจหรือว่าคุณไม่ได้มีปฏิกิริยาที่ฉุดเข่า? มันเป็นความจริงว่าสิ่งที่ต้องการ-1ในstr.indexOf(substr) != -1สำหรับ " strมีsubstr" เป็นธรรม prefectly แต่ที่นี่ความหมายของ 0 ไม่ชัดเจน (สิ่งที่ไม่เกี่ยวข้องกับการสร้างผู้ขายใหม่) หรือไม่คงที่อย่างแท้จริง (ถ้าวิธีการสร้างการเปลี่ยนแปลงผู้ขายใหม่หรือไม่)

62
คุณต้องเรียนรู้กฎก่อนที่จะทำลายกฎ
Ryathal

12
ฉันมีวิธีนี้ล้มเหลวกับฉันโดยไม่คาดคิด รายการถูกจัดเรียงตามตัวอักษร ฉันใช้- - สร้างใหม่ - -ดังนั้นเครื่องหมายขีดคั่นจะเรียงลำดับแรกและดัชนีที่กำหนดรหัสฮาร์ด 0 เป็นวิธีสร้างใหม่ จากนั้นมีบางคนเพิ่มรายการที่เริ่มต้นด้วยคำพูดเดียว'รายการของฉัน'ซึ่งเรียงลำดับก่อนที่จะขีดกลาง การเข้ารหัสที่ยากของฉันทำให้โปรแกรมขัดข้องในครั้งต่อไปที่โหลดรายการ ฉันต้องแก้ไขไฟล์ข้อมูลของรายการด้วยตนเองเพื่อกู้คืนข้อมูลลูกค้า
อาหารมือ

14
คุณสามารถใช้int.Zeroแทนเพื่อทำให้เขามีความสุข :)
Paul Stovell

คำตอบ:


90

วิธีที่ถูกต้องจริงในการทำสิ่งนี้ใน C # คือการไม่พึ่งพาการสั่งซื้อ ComboItemsเลย

public partial class MyForm : Form
{
    private readonly object VENDOR_NEW = new object();

    public MyForm()
    {
        InitializeComponents();
        comboVendor.Items.Insert(0, VENDOR_NEW);
    }

    private void comboVendor_Format(object sender, ListControlConvertEventArgs e)
    {
        e.Value = (e.ListItem == VENDOR_NEW ? "Create New Vendor" : e.ListItem);
    }

    private void comboVendor_SelectedIndexChanged(object sender, EventArgs e)
    {
        if(comboVendor.SelectedItem == VENDOR_NEW)
        {
            //Special logic for selecting "create new vendor"
        }
        else
        {
            //Usual logic
        }
    }
}

22
ถ้านี่คือ C # คุณไม่ควรใช้ ALL_CAPS สำหรับค่าคงที่ ค่าคงที่ควรเป็น PascalCased - stackoverflow.com/questions/242534/…
Groky

4
@Groky: ทำไมเรื่องนี้? ใครสนใจว่าเขาตั้งชื่อค่าคงที่อย่างไร สิ่งนี้ถูกต้อง 100% ถ้าเขาใช้ ALL_CAPS ในลักษณะที่สอดคล้องกับค่าคงที่
marco-fiset

4
@marcof: ถ้าค่าคงที่เป็นส่วนหนึ่งของส่วนต่อประสานสาธารณะเขาควรทำตามแนวทางการตั้งชื่อ MS ถ้าไม่เช่นนั้นเขาควรเรียนรู้วิธีปฏิบัติที่ดีที่สุดตั้งแต่เนิ่นๆ
Groky

2
สิ่งนี้ยังไม่ถูกต้อง มันเปลี่ยนปัญหาจากการมีตัวอักษรจำนวนเต็ม (ศูนย์) เพื่อตัวอักษรสตริง (สร้างผู้ขายใหม่) ที่ดีที่สุดปัญหาคือตอนนี้ 'ถ้าฉลากเปลี่ยน' แทนที่จะเป็น 'จะเกิดอะไรขึ้นถ้าดัชนีเปลี่ยนไป'
Freiheit

7
@Freiheit: ไม่ถูกต้อง ค่าคงที่สตริงที่นี่มีไว้สำหรับแสดงเท่านั้น ไม่ส่งผลกระทบต่อตรรกะของโปรแกรม แต่อย่างใด ซึ่งแตกต่างจากการใช้ค่ามายากล / สตริงในการจัดเก็บโปรแกรมรัฐการเปลี่ยนสายนี้(หรือเพิ่ม / ลบสิ่งต่าง ๆ จากรายการ)ไม่สามารถทำลายอะไร
BlueRaja - Danny Pflughoeft

83

การสั่งซื้อในกล่องคำสั่งผสมอาจมีการเปลี่ยนแปลง จะเกิดอะไรขึ้นถ้าคุณเพิ่มตัวเลือกอื่นเช่น "สร้างผู้ขายพิเศษ ... " ก่อน "สร้างผู้ขายใหม่ ... "

ข้อได้เปรียบของการใช้ค่าคงที่คือถ้ามีวิธีการมากมายที่ขึ้นอยู่กับคำสั่งของกล่องคำสั่งผสมคุณจะต้องเปลี่ยนค่าคงที่และไม่ใช่วิธีการทั้งหมดหากมีการเปลี่ยนแปลง

การใช้ค่าคงที่ยังอ่านได้ง่ายกว่าตัวอักษร

if (comboVendor.SelectedIndex == NewVendorIndex)

ภาษาที่รวบรวมส่วนใหญ่จะแทนที่ค่าคงที่ในเวลารวบรวมดังนั้นจึงไม่มีการลงโทษประสิทธิภาพ


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

1
@Chad ฉันเห็นด้วยกับการระบุการควบคุมตามคำสั่งใน gui ที่บอบบางมาก หากภาษารองรับการเพิ่มค่าให้กับองค์ประกอบ gui ที่สามารถค้นหาได้ฉันจะใช้มัน
Michael Krussel

3
@solution เพราะนั่นคือการประชุม
Ikke

3
@Ikeke นั่นไม่ใช่การประชุมแน่นอน stackoverflow.com/questions/242534/…
SolutionYogi

1
ถ้าเรากำลังพูดถึง C # แล้ว NewVendorIndex IS เป็นแบบแผน มันสอดคล้องกับสไตล์. NET ที่เหลือ
MaR

36

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

คำตอบที่แท้จริงคือว่าเขาเลือกสิ่งนี้เพื่อสอนบทเรียนให้คุณ

อย่าลืมว่าเขาเป็นอาจารย์หน้าที่ของเขาคือสอนการเขียนโค้ดและการปฏิบัติที่ดีที่สุด

ฉันว่าเขาทำงานได้ดีจริง ๆ แล้ว

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

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

ถอดอาจารย์ของคุณออก


+1 สำหรับการระบุว่าในกรณีนี้หมายถึงการปรับผลลัพธ์สุดท้าย
oliver-clare

@ Thanos- " อย่าลืมว่าเขาเป็นศาสตราจารย์หน้าที่ของเขาคือการสอนการเขียนโค้ดและการปฏิบัติที่ดีที่สุด " นี่ไม่เคยเกิดขึ้นกับศาสตราจารย์ของฉัน ฉันจะบอกว่างานของเขาคือการสอนคุณในสิ่งที่ภาควิชารู้สึกมีความสำคัญเมื่อสร้างหลักสูตร
Ramhound

13

[... ]ตัวเลือกอันดับแรกของฉัน (ดัชนี 0 ที่ไม่เคยเปลี่ยนแปลง) เปิดกล่องโต้ตอบ "สร้างผู้ขายใหม่"

ความจริงที่ว่าคุณต้องอธิบายซึ่งพิสูจน์ว่าทำไมคุณควรใช้ค่าคงที่ หากคุณแนะนำแบบคงที่NEW_VENDOR_DIALOGรหัสของคุณจะอธิบายได้ด้วยตนเองมากกว่า นอกจากนี้คอมไพเลอร์ยังปรับค่าคงที่ให้เหมาะสมดังนั้นจะไม่มีการเปลี่ยนแปลงในประสิทธิภาพ

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


2
-1 เพื่อประสิทธิภาพที่กล่าวถึง แม้ว่าจะไม่ได้รับการปรับให้เหมาะสมคอมพิวเตอร์ก็สามารถทำสิ่งต่างๆได้หลายพันล้านครั้งก่อนที่ผู้ใช้จะสังเกตเห็น
Boris Yankov

3
@ Boris OP ดูเหมือนจะกังวลเกี่ยวกับการสิ้นเปลืองทรัพยากรซึ่งเป็นสาเหตุที่ฉันพูดถึงมัน ฉันไม่เห็นว่าคำตอบของฉันจะถูกต้องน้อยลงอย่างไร
kba

12

เขาอ้างว่า 0 ควรเป็นค่าคงที่และทำเครื่องหมายให้ฉันจริงเพราะสิ่งนั้น

ฉันเห็นด้วย การใช้ศูนย์ที่นี่คือ "วิเศษ" ลองจินตนาการว่าคุณกำลังอ่านรหัสนี้เป็นครั้งแรก คุณไม่รู้ว่าทำไมศูนย์ถึงพิเศษและตัวอักษรไม่ได้บอกคุณว่าทำไมศูนย์ถึงพิเศษ ถ้าคุณบอกว่าif(comboVendor.SelectedIndex == CreateNewVendorIndex)มันจะชัดเจนยิ่งขึ้นสำหรับผู้อ่านครั้งแรกว่าโค้ดนั้นหมายถึงอะไร

เขาอ้างว่าฉันไม่ควรใช้ตัวอักษรในรหัสของฉันเลย

นั่นเป็นตำแหน่งที่รุนแรง ตำแหน่งที่เป็นจริงคือการกล่าวว่าการใช้ตัวอักษรเป็นธงสีแดงที่ระบุว่ารหัสอาจไม่ชัดเจนเท่าที่ควร บางครั้งก็เหมาะสม

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

ว่าจะไม่เปลี่ยนแปลงเป็นที่ยอดเยี่ยมเหตุผลที่จะทำให้มันคงที่ นั่นเป็นสาเหตุที่ค่าคงที่เรียกว่าค่าคงที่ เพราะพวกเขาไม่เคยเปลี่ยน

และมันเป็นสิ่งที่คุณจะต้องปรับแต่ง

จริงๆ? คุณไม่เห็นสถานการณ์ใด ๆที่ใครบางคนอาจต้องการเปลี่ยนลำดับของสิ่งต่าง ๆ ในกล่องคำสั่งผสม?

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

ดูเหมือนว่าหน่วยความจำไม่เพียงพอที่จะเก็บ 0 ในหน่วยความจำที่ใช้สำหรับสถานการณ์ที่เฉพาะเจาะจงมากและไม่เคยเปลี่ยนแปลง

ตอนนี้เรามาถึงปมของเรื่อง

นี่อาจเป็นบรรทัดที่สำคัญที่สุดในคำถามของคุณเพราะมันบ่งบอกว่าคุณมีความเข้าใจที่ไม่สมบูรณ์เกี่ยวกับ (1) หน่วยความจำและ (2) การปรับให้เหมาะสม คุณอยู่ในโรงเรียนเพื่อเรียนรู้และตอนนี้จะเป็นเวลาที่ดีในการทำความเข้าใจพื้นฐานที่ถูกต้อง คุณสามารถอธิบายโดยละเอียดได้ไหมว่าทำไมคุณถึงเชื่อว่า "การสูญเสียความทรงจำในการเก็บศูนย์ในหน่วยความจำเดียว"? ก่อนอื่นทำไมคุณถึงเชื่อว่าการเพิ่มประสิทธิภาพการใช้หน่วยความจำสี่ไบต์ในกระบวนการที่มีพื้นที่เก็บข้อมูลที่ผู้ใช้ระบุได้อย่างน้อยสองพันล้านไบต์มีความเกี่ยวข้องกัน ประการที่สองสิ่งที่คุณคิดว่าการบริโภคทรัพยากรที่นี่คืออะไร? คุณหมายถึงอะไรโดย "ความทรงจำ" ที่ถูกบริโภค?

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


6

เขาพูดถูก. คุณถูก. คุณผิด.

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

ที่ถูกกล่าวว่าคุณถูกต้อง ในกรณีเฉพาะนี้ฉันไม่คิดว่าจะรับประกันค่าคงที่ คุณกำลังมองหารายการแรกในรายการซึ่งเป็นศูนย์เสมอ จะไม่เป็น 23 หรือ -pi คุณกำลังมองหาศูนย์โดยเฉพาะ ฉันไม่คิดว่าคุณจะต้องทำให้รหัสยุ่งเหยิงโดยทำให้มันคงที่

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


1
ฉันเกือบจะโหวตคำตอบนี้ถ้าไม่ใช่สำหรับย่อหน้าที่สามโดยอ้างว่าการใช้ตัวอักษร 0 นั้นชัดเจนเพียงพอและไม่มีการรับประกันคงที่ วิธีแก้ปัญหาที่ดีกว่านั้นไม่ได้ขึ้นอยู่กับการจัดทำดัชนีของรายการคำสั่งผสมทั้งหมด แต่จะพิจารณาจากมูลค่าของรายการที่เลือกแทน ค่าคงที่เวทย์มนตร์เป็นค่าคงที่เวทย์มนตร์แม้ว่าจะเป็น 0 หรือ 3.14 หรืออะไรก็ตาม - ตั้งชื่ออย่างเหมาะสมเพราะจะทำให้โค้ดอ่านง่ายขึ้น
Roland Tepp

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

ฉันจะไม่เห็นด้วย ... จากการดูรหัสมันไม่เคยเห็นได้ชัดเลยว่าความสำคัญของ 0 คืออะไร - มันอาจเป็นไปได้ว่าเขามักจะมองหารายการแรกในรายการและนั่นคือมัน แต่หลังจากนั้น จะอ่านสะอาดกว่านี้ถ้าการเปรียบเทียบจะเป็น 'comboVendor.SelectedIndex == FirstIndex' แทน
Roland Tepp

2

ฉันจะได้เปลี่ยนที่มีอย่างต่อเนื่องเพื่อให้ความหมายที่ชัดเจนเช่น0 NewVendorIndexคุณไม่มีทางรู้ว่าคำสั่งซื้อของคุณจะเปลี่ยนไปหรือไม่


1

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

การฝึกอบรมที่ดีสำหรับโลกธุรกิจ? ค่อนข้างเป็นไปได้


2
ฉันไม่เห็นด้วยกับส่วน "ใช้ค่าคงที่หากส่วนตัวอักษรจะถูกใช้หลายครั้ง" ด้วย 0 (และอาจจะ -1, 1) มันมักจะชัดเจนในกรณีส่วนใหญ่มันเป็นสิ่งที่ดีที่จะให้ชื่อกับสิ่งที่เป็นวิธีที่ชัดเจนมากขึ้นอ่านมารยาทในการอ่านรหัส
johannes

1

ความจริงแล้วในขณะที่ฉันไม่คิดว่ารหัสของคุณเป็นแนวปฏิบัติที่ดีที่สุดข้อเสนอแนะของเขานั้นค่อนข้างแปลกประหลาด

วิธีปฏิบัติทั่วไปเพิ่มเติมสำหรับ. NET combobox คือการให้รายการ "Select .. " เป็นค่าว่างเปล่าในขณะที่รายการจริงมีค่าที่มีความหมายแล้วทำ:

if (string.IsNullOrEmpty(comboVendor.SelectedValue))

ค่อนข้างมากกว่า

if (comboVendor.SelectedIndex == 0)

3
ในตัวอย่างของคุณ null เป็นเพียงตัวอักษรอื่น หัวใจของบทเรียนนี้คือการหลีกเลี่ยงตัวอักษร
overslacked

@overslacked - ไม่มีตัวอย่างที่แท้จริงในตัวอย่างของฉัน
Carson63000

แม้ว่าจะมีตัวอักษรที่เป็นโมฆะ แต่โมฆะก็เป็นตัวอักษรที่สามารถใช้ได้ แต่ฉันก็ไม่เชื่อว่ามีวิธีการตรวจสอบว่าการอ้างอิงถึงวัตถุนั้นเป็นโมฆะหรือไม่โดยไม่ต้องใช้การตรวจสอบว่ามันเป็นโมฆะ
Ramhound

Carson63000 - ฉันหมายถึงการใช้ IsNullOrEmpty ของคุณ คุณกำลังสลับ "ค่าเวทย์มนตร์" หนึ่งอันสำหรับอีกอันหนึ่ง @Ramhound - Null เป็นตัวอักษรที่ยอมรับได้ในบางกรณีไม่มีคำถาม แต่ฉันไม่เชื่อว่านี่เป็นตัวอย่างที่ดี (ใช้ null หรือว่างเปล่าเป็นค่าเวทมนต์)
โอเวอร์รัน

-1 สำหรับ "พิลึกเล็ก ๆ น้อย ๆ " ในขณะที่คุณพูดถูกว่าการใช้ค่าจะธรรมดากว่าและเข้าใจง่ายกว่าถ้าใช้
ดัชนีที่

1

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

ประเด็นของเขานั้นดีแม้ว่า นี่อาจเป็นวิธีของเขาที่จะทำให้คุณตระหนักถึงประโยชน์ของค่าคงที่:

1- พวกเขาปกป้องรหัสของคุณในระดับหนึ่งจากการดัดแปลงโดยไม่ได้ตั้งใจ

2-As @DeadMG กล่าวว่าในคำตอบของเขาหากมีการใช้ค่าตัวอักษรเดียวกันในหลาย ๆ ที่มันอาจปรากฏขึ้นด้วยค่าที่แตกต่างกันโดยไม่ได้ตั้งใจ - ดังนั้นค่าคงที่จะคงที่

ค่าคงที่ 3-type อนุรักษ์ดังนั้นคุณไม่จำเป็นต้องใช้อะไรเช่น 0F เพื่อหมายถึงศูนย์

4- เพื่อความสะดวกในการอ่าน COBOL ใช้ ZERO เป็นคำสงวนสำหรับค่าศูนย์ (แต่อนุญาตให้คุณใช้ตัวอักษรเป็นศูนย์) - ดังนั้นการให้ค่าชื่อบางครั้งก็มีประโยชน์เช่น: (ที่มา: ms-Constants

class CalendarCalc
{
    const int months = 12;
    const int weeks = 52; //This is not the best way to initialize weeks see comment
    const int days = 365;

    const double daysPerWeek = (double) days / (double) weeks;
    const double daysPerMonth = (double) days / (double) months;
}

หรือในกรณีของคุณ (ดังแสดงในคำตอบ @Michael Krussel)


2
นั่นจะเป็นคำจำกัดความที่แปลกสำหรับวันต่อสัปดาห์หรือไม่? มี 7 วันต่อสัปดาห์ไม่ใช่ 7.4287143
Winston Ewert

@ Winston ขอขอบคุณสำหรับความคิดเห็นของคุณ 365/52 = 7.01923076923077 = 7 + (1/52) ตอนนี้ถ้าคุณลบส่วนที่เป็นเศษส่วนและคำนวณ 7 * 52 คุณจะได้รับ 364 วันซึ่งไม่ใช่จำนวนวันที่ถูกต้องในหนึ่งปี การมีเศษส่วนมีความแม่นยำมากกว่าการสูญเสีย (เนื่องจากคุณสามารถจัดรูปแบบผลลัพธ์เพื่อแสดง 7 หากคุณต้องการแสดงเฉพาะตัวเลข) อย่างไรก็ตามมันเป็นเพียงตัวอย่างจาก MS เกี่ยวกับค่าคงที่ แต่ประเด็นของคุณน่าสนใจ
NoChance

1
แน่นอนมันเป็นเพียงตัวอย่าง แต่ฉันคัดค้านคำสั่งของคุณว่ามีความแม่นยำมากขึ้นในการรวมเศษส่วน หนึ่งสัปดาห์หมายถึง 7 วัน คำนิยามของคุณใน 26 สัปดาห์คือ 182.5 วันซึ่งไม่ถูกต้อง จริงๆปัญหาคือคุณint weeks = 52ไม่มี 52 สัปดาห์ต่อปี มี 52.142857142857146 สัปดาห์ในหนึ่งปีและนั่นคือจำนวนที่คุณควรรักษาเศษส่วนไว้ แน่นอนสิ่งเดียวที่คงที่ในจำนวนคงที่ตลอดทั้งเดือน
Winston Ewert

0

คุณจะต้องใส่มันในค่าคงที่ถ้ามันมีความซับซ้อนมาหรือถ้ามันซ้ำบ่อย ๆ อื่น ๆ ตัวอักษรเป็นเรื่องปกติ การใส่ทุกอย่างไว้ในค่าคงที่นั้นเป็นผลรวมที่มากเกินไป


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

0

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

ดังนั้นเมื่อคุณสร้างรายการที่คุณเลือกมันจะจบลงด้วย html like

<select>
    <option value='CREATE'>Create New Vendor...</option>
    <option value='1'>Existing Vendor</option>
    <option value='2'>Existing Vendor 2</option>
    <option value='3'>Existing Vendor 3</option>
</select>

จากนั้นแทนการตรวจสอบตรวจselectedIndex === 0สอบว่าค่าCREATECODEที่จะเป็นในค่าคงที่และจะถูกใช้สำหรับทั้งการทดสอบนี้และเมื่อสร้างรายการที่เลือก


3
อาจเป็นวิธีที่ดี แต่การเห็นว่าเขาใช้ C #, html จะไม่เป็นรหัสตัวอย่างที่มีความหวังมากที่สุด
Winston Ewert

0

ฉันจะกำจัดมันโดยสิ้นเชิง เพียงแค่ใส่ปุ่มสร้างใหม่ถัดจากรายการกล่องคำสั่งผสม ดับเบิลคลิกที่รายการในรายการเพื่อแก้ไขหรือคลิกปุ่ม ไม่มีฟังก์ชั่นใหม่ที่ฝังอยู่ในคอมโบบ็อกซ์ จากนั้นหมายเลขมายากลจะถูกลบออกไปโดยสิ้นเชิง

โดยทั่วไปหมายเลขตัวอักษรใด ๆ ในรหัสควรกำหนดเป็นค่าคงที่เพื่อใส่บริบทรอบ ๆ จำนวน ศูนย์หมายถึงอะไร ในกรณีนี้ 0 = NEW_VENDOR ในกรณีอื่น ๆ อาจหมายถึงบางสิ่งที่แตกต่างกันดังนั้นจึงเป็นความคิดที่ดีสำหรับความสามารถในการอ่านและการบำรุงรักษาที่จะนำบริบทมาใช้


0

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

เหตุผลที่ฉันเขียนคือเพื่อระบุความคิดเห็นของคุณใน "การใช้หน่วยความจำ" ใน C # ในภาษาส่วนใหญ่ค่าคงที่จะถูก "พับ" โดยคอมไพเลอร์ ตัวอย่างเช่นรวบรวมโปรแกรมต่อไปนี้และตรวจสอบ IL คุณจะพบว่าตัวเลขเหล่านี้ไม่ได้ทำให้เป็นความทรงจำของคอมพิวเตอร์เลยแม้แต่น้อย:

public class Program
{
    public static int Main()
    {
        const int a = 1000;
        const int b = a + a;
        const int c = b + 42;
        const int d = 7928345;
        return (a + b + c + d) / (-a - b - c - d);
    }
}

ส่งผลให้ IL:

.method public hidebysig static 
    int32 Main () cil managed 
{
    .maxstack 1
    .locals init (
        [0] int32 CS$1$0000
    )

    IL_0000: nop
    IL_0001: ldc.i4.m1  // the constant value -1 to be returned.
    IL_0002: stloc.0
    IL_0003: br.s IL_0005

    IL_0005: ldloc.0
    IL_0006: ret
}

ดังนั้นไม่ว่าคุณจะใช้ค่าคงที่ตัวอักษรหรือรหัสกิโลไบต์โดยใช้เลขคณิตคงที่ค่าจะได้รับการปฏิบัติอย่างแท้จริงใน IL

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

public class Program
{
    public static int Main()
    {
        const string a = "a";
        const string b = a + a;
        const string c = "C";
        const string d = "Dee";
        return (a + b + c + d).Length;
    }
}

แต่ลองดู IL:

IL_0000: nop
IL_0001: ldstr "aaaCDee"
IL_0006: callvirt instance int32 [mscorlib]System.String::get_Length()
IL_000b: stloc.0
IL_000c: br.s IL_000e
IL_000e: ldloc.0
IL_000f: ret

Bottom line: ตัวดำเนินการบนนิพจน์คงที่ส่งผลให้เกิดนิพจน์คงที่และคอมไพเลอร์ทำการคำนวณทั้งหมด ไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน

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