วิศวกรรมซอฟต์แวร์

ถาม - ตอบสำหรับมืออาชีพนักวิชาการและนักเรียนที่ทำงานในวงจรการพัฒนาระบบ

3
ทำงานผ่านหลักการความรับผิดชอบเดี่ยว (SRP) ใน Python เมื่อการโทรมีราคาแพง
บางจุดฐาน: การเรียกใช้เมธอด Python นั้น "แพง" เนื่องจากเป็นลักษณะที่ตีความได้ ในทางทฤษฎีถ้ารหัสของคุณก็พอง่ายที่จะหมดสภาพรหัสงูใหญ่มีผลกระทบเชิงลบที่นอกเหนือจากการอ่านและนำมาใช้ใหม่ ( ซึ่งเป็นกำไรที่ยิ่งใหญ่สำหรับนักพัฒนาไม่มากสำหรับผู้ใช้ ) หลักการความรับผิดชอบเดี่ยว (SRP) ช่วยให้สามารถอ่านโค้ดง่ายต่อการทดสอบและบำรุงรักษา โครงการมีพื้นหลังแบบพิเศษที่เราต้องการให้สามารถอ่านโค้ดการทดสอบและประสิทธิภาพของเวลาได้ ตัวอย่างเช่นโค้ดเช่นนี้ซึ่งเรียกใช้หลายวิธี (x4) จะช้ากว่าวิธีต่อไปนี้ซึ่งเป็นวิธีเดียว from operator import add class Vector: def __init__(self,list_of_3): self.coordinates = list_of_3 def move(self,movement): self.coordinates = list( map(add, self.coordinates, movement)) return self.coordinates def revert(self): self.coordinates = self.coordinates[::-1] return self.coordinates def get_coordinates(self): return self.coordinates ## …

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

5
ทีมของฉันกลัวฐานข้อมูลเชิงสัมพันธ์ที่มีความสัมพันธ์กับต่างประเทศและฉันไม่เข้าใจว่าทำไม
ฉันค่อนข้างใหม่นอกมหาวิทยาลัยดังนั้นความคุ้นเคยกับฐานข้อมูลเชิงสัมพันธ์ส่วนใหญ่มาจากหลักสูตรฐานข้อมูลของฉันซึ่งไม่มีอะไรใน BCNF หรือ 3NF เป็นการเลียนแบบ แน่นอนว่าปลายด้านหนึ่งของสุดขั้ว แต่ทีมของฉันในที่ทำงานดูเหมือนจะนำไปสู่จุดจบที่ตรงกันข้ามอย่างสมบูรณ์ ใน microservice db schemas ของเราเอนทิตีมักจะมีมากกว่าหนึ่งตาราง สิ่งใดก็ตามที่คุณต้องการทำให้เป็นปกติในตารางอื่นจะถูกเก็บไว้ในคอลัมน์ json หากภายหลังพบว่าคุณสมบัติอย่างใดอย่างหนึ่งใน json นี้ต้องถูกสอบถามคอลัมน์ใหม่จะถูกเพิ่มและข้อมูลจะถูกเก็บไว้ในทั้งสองแห่ง (ใช่ในคอลัมน์ที่ต่างกันสองแห่งในตารางเดียวกัน) ในหลายกรณีคอลัมน์ json เหล่านี้มีข้อได้เปรียบอย่างแน่นอน หากคุณไม่จำเป็นต้องสืบค้นข้อมูลนั้นและหากคุณไม่จำเป็นต้องทำการเปลี่ยนแปลงข้อมูลข้างเดียว (ซึ่งเป็นสิ่งที่คุณไม่สามารถคาดการณ์ได้อย่างชัดเจน) นั่นไม่ใช่ความคิดที่ไม่ดี บวกกับบริการหลายอย่างของเราที่ไม่เห็นเซิร์ฟเวอร์หรือโฮสต์อยู่บนเครื่องที่มีเนื้อที่ดิสก์ลามกอนาจารสำหรับสิ่งที่พวกเขาต้องการดังนั้นการทำสำเนาข้อมูลจึงไม่ใช่ปัญหาใหญ่ (ถึงแม้ว่าสิ่งที่ฉันมักจะต้องการหลีกเลี่ยงปรัชญา) ขณะนี้เรากำลังสร้างบริการที่ตรงกับกฎตามชุดเงื่อนไขที่พวกเขาเป็นเจ้าของแล้วดำเนินการชุดของการกระทำที่เกี่ยวข้องกับกฎเหล่านั้นเมื่อกฎเป็นจริง (เช่นเงื่อนไขทั้งหมดเป็นจริง) ทีมงานย่อยของฉันที่สร้างบริการนี้ในทันทีส่วนใหญ่เชื่อว่ามีประโยชน์อย่างมากในการทำให้การดำเนินการและเงื่อนไขเป็นปกติอยู่ห่างจากกฎในสคีมา เห็นได้ชัดว่าตารางเหล่านี้รักษาความสัมพันธ์กับต่างประเทศที่สำคัญกับรหัสกฎ จากมุมมองของเราเราสามารถหลีกเลี่ยงการทำซ้ำข้อมูลในเงื่อนไขที่ทำให้เรามั่นใจได้ว่าพวกเขาจะได้รับการประเมินเพียงครั้งเดียวและเป็นเรื่องง่ายที่จะหาเงื่อนไขและกฎที่เราต้องการเมื่อต้องการโดยไม่ต้องดึงกฎออกทุกครั้ง การพูดกับหนึ่งในวิศวกรหลักของเราในวันนี้เขาพยายามผลักฉันให้ห่างจากสคีมานี้ การพยายามโต้แย้งในทุก ๆ ด้านที่เราไม่ต้องการจริง ๆ มันจะทำให้เกิดปัญหาด้านประสิทธิภาพในอนาคตโดยอ้างอิงจากหินก้อนเดียวที่เราเป็นเจ้าของนั่นคือการเลียนแบบการออกแบบ เขาอ้างถึงสิ่งที่เราทำในฐานะ "วิธีเก่า" และโต๊ะแบนที่มี json เป็น "วิธีใหม่" เขาแย้งว่าในสถานที่ที่ฉันต้องการอะตอมมิกเราไม่ต้องการมันและแทนที่จะเป็นแบบสอบถามเราควรทำหลายอย่างในความทรงจำ นี่คือหลักการออกแบบที่บริการหลายอย่างของเราปฏิบัติตามในขณะนี้ เราไม่คาดหวังว่าปริมาณข้อมูลของเราจะเติบโตอย่างมีนัยสำคัญซึ่งจะทำให้การสืบค้นของเรารวดเร็ว สิ่งที่เราคาดหวังคือเวลาที่ใช้ในการประเมินกฎและการดำเนินการ ฉันเข้าใจว่าฐานข้อมูลเชิงสัมพันธ์ที่ไม่ได้เป็นที่นิยมมากขึ้นในช่วงไม่กี่ปีที่ผ่านมา แต่แม้ในขณะที่ค้นหาข้อมูลเกี่ยวกับผลการปฏิบัติงานของความสัมพันธ์กับต่างประเทศที่สำคัญฉันไม่เห็นข้อมูลจำนวนมากที่ทำให้คดีของเขา ฉันคิดว่าพวกเขามีแนวโน้มที่จะแนะนำการทำธุรกรรมขนาดใหญ่ซึ่งอาจทำให้เกิดปัญหา …

6
DDD เป็นไปตาม OOP: วิธีการใช้พื้นที่เก็บข้อมูลเชิงวัตถุ?
การใช้งานทั่วไปของแหล่งเก็บข้อมูล DDD ดูไม่ OO มากเช่นsave()วิธีการ: package com.example.domain; public class Product { /* public attributes for brevity */ public String name; public Double price; } public interface ProductRepo { void save(Product product); } ส่วนโครงสร้างพื้นฐาน: package com.example.infrastructure; // imports... public class JdbcProductRepo implements ProductRepo { private JdbcTemplate = ... public void save(Product …

2
เหตุใดคลาสพื้นฐานจำเป็นต้องมี destructor เสมือนจริงที่นี่ถ้าคลาสที่ได้รับจัดสรรหน่วยความจำแบบไดนามิกดิบไม่ได้?
รหัสต่อไปนี้ทำให้หน่วยความจำรั่ว: #include <iostream> #include <memory> #include <vector> using namespace std; class base { void virtual initialize_vector() = 0; }; class derived : public base { private: vector<int> vec; public: derived() { initialize_vector(); } void initialize_vector() { for (int i = 0; i < 1000000; i++) { vec.push_back(i); } } }; …

2
คำจำกัดความของ "เสร็จสิ้น" ในกรณีที่ทีมพัฒนาหลายแห่งทำงานกับผลิตภัณฑ์เดียวกัน
หนึ่งในการทดสอบการทะเลาะกันประกอบด้วยคำถามเกี่ยวกับคำนิยามที่ดีที่สุดที่อธิบายว่า "เสร็จสิ้น" เมื่อทีมพัฒนาหลายคนทำงานในผลิตภัณฑ์เดียวกัน คำตอบที่ถูกต้องระบุว่าทีมพัฒนาเหล่านั้นต้องมีคำจำกัดความของ "เสร็จสิ้น" ที่สามารถทำให้การทำงานร่วมกันของพวกเขาอาจเป็นไปได้ สิ่งที่ไม่ชัดเจนสำหรับฉันจากคำตอบที่เหมาะสมสำหรับคำถามนี้คือ: ทีมสามารถมีคำจำกัดความที่แตกต่างกันของ "เสร็จสิ้น" ได้หรือไม่ ในระดับใด
12 agile  scrum 

1
ใช้คลาสเพื่อนเพื่อแค็ปซูลฟังก์ชั่นสมาชิกส่วนตัวใน C ++ - การปฏิบัติที่ดีหรือการละเมิด?
ดังนั้นฉันสังเกตเห็นว่าเป็นไปได้ที่จะหลีกเลี่ยงการใส่ฟังก์ชั่นส่วนตัวไว้ในส่วนหัวโดยทำสิ่งนี้: // In file pred_list.h: class PredicateList { int somePrivateField; friend class PredicateList_HelperFunctions; public: bool match(); } // In file pred_list.cpp: class PredicateList_HelperFunctions { static bool fullMatch(PredicateList& p) { return p.somePrivateField == 5; // or whatever } } bool PredicateList::match() { return PredicateList_HelperFunctions::fullMatch(*this); } ฟังก์ชั่นส่วนตัวไม่เคยประกาศในส่วนหัวและผู้บริโภคของชั้นเรียนที่นำเข้าส่วนหัวไม่จำเป็นต้องรู้ว่ามันมีอยู่ นี่เป็นสิ่งจำเป็นหากฟังก์ชันตัวช่วยเป็นเทมเพลต (ทางเลือกคือใส่รหัสเต็มในส่วนหัว) ซึ่งเป็นวิธีที่ฉัน "ค้นพบ" สิ่งนี้ …

4
วิธีการตรวจสอบโค้ดที่ดีขึ้นเมื่อดึงคำขอมีขนาดใหญ่
คำเตือน:มีคำถามที่คล้ายกัน แต่ฉันไม่พบใด ๆ ที่สัมผัสกับปัญหาที่คุณเผชิญโดยเฉพาะในขณะที่ตรวจสอบคำขอดึงขนาดใหญ่ ปัญหา ฉันรู้สึกว่าบทวิจารณ์โค้ดของฉันสามารถทำได้ในวิธีที่ดีกว่า ฉันกำลังพูดถึงความคิดเห็นเกี่ยวกับโค้ดขนาดใหญ่ที่มีการเปลี่ยนแปลงมากมายในไฟล์มากกว่า 20 ไฟล์ มันค่อนข้างง่ายที่จะจับปัญหารหัสท้องถิ่นที่ชัดเจน การเข้าใจว่ารหัสตรงตามเกณฑ์ทางธุรกิจเป็นเรื่องที่ต่างออกไป ฉันมีปัญหาในการติดตามกระบวนการคิดของผู้เขียนรหัส มันค่อนข้างยากเมื่อมีการเปลี่ยนแปลงมากมายและกระจายข้ามหลายไฟล์ ฉันพยายามเน้นกลุ่มของไฟล์ที่เกี่ยวข้องกับการเปลี่ยนแปลงบางอย่าง จากนั้นให้ทบทวนกลุ่มทีละคน น่าเสียดายที่เครื่องมือที่ฉันใช้ (Atlassian Bitbucket) ไม่มีประโยชน์มาก เมื่อใดก็ตามที่ฉันเยี่ยมชมไฟล์มันจะถูกทำเครื่องหมายตามที่เห็นแม้ว่าบ่อยครั้งที่ปรากฎว่าไม่เกี่ยวข้องกับการเปลี่ยนแปลงที่ตรวจสอบในปัจจุบัน ไม่ต้องพูดถึงว่าไฟล์บางไฟล์ควรมีการเข้าชมหลายครั้งและการเปลี่ยนแปลงจะมีการตรวจสอบทีละชิ้น การกลับมาที่ไฟล์ที่เกี่ยวข้องเช่นกันเมื่อคุณติดตามเส้นทางที่ไม่ดีนั้นไม่ใช่เรื่องง่าย วิธีแก้ปัญหาที่เป็นไปได้และทำไมมันถึงไม่เหมาะกับฉัน การตรวจสอบคำขอดึงโดยการกระทำมักจะแก้ปัญหาขนาด แต่ฉันไม่ชอบเพราะฉันมักจะดูการเปลี่ยนแปลงที่ล้าสมัย แน่นอนว่าการสร้างคำขอดึงที่เล็กลงดูเหมือนจะเป็นวิธีการรักษา แต่มันเป็นสิ่งที่มันเป็นบางครั้งคุณจะได้รับคำขอดึงที่มีขนาดใหญ่และต้องได้รับการตรวจสอบ นอกจากนี้คุณยังสามารถละเว้นลักษณะเชิงตรรกะของรหัสโดยรวม แต่ดูเหมือนเสี่ยงมากโดยเฉพาะเมื่อรหัสนั้นมาจากโปรแกรมเมอร์ที่ไม่มีประสบการณ์ การใช้เครื่องมือที่ดีกว่าอาจมีประโยชน์ แต่ฉันไม่พบสิ่งใดเลย คำถาม คุณมีปัญหาที่คล้ายกันกับรีวิวรหัสของคุณ? คุณเผชิญกับพวกเขาได้อย่างไร บางทีคุณอาจมีเครื่องมือที่ดีกว่า

4
เหตุใด XSLT จึงไม่ค่อยถูกใช้บนเว็บ? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา XSLT เป็นมาตรฐานที่ผู้ใหญ่ยอมรับอย่างกว้างขวาง มันสามารถใช้ในเบราว์เซอร์ (แม้แต่ใน IE เก่า) และบนฝั่งเซิร์ฟเวอร์ (nginx มีโมดูล XSLT ซึ่งสามารถใช้ได้จากภาษาการเขียนโปรแกรมแน่นอน) การใช้งานของมันจะรวบรวมและดังนั้นควรจะเร็วกว่า Python หรือ JS การติดตั้ง JS Saxon JS สามารถใช้อย่างน้อยเป็นทางเลือก จินจา, เชิงมุม, รูบี้ของ Slim, ASP และ PHP เทมเพลตยังไม่ได้ใกล้เคียง เท็มเพลต XSL สามารถตรวจสอบได้ง่ายใน IDE IDEs สามารถช่วยกับ Jinja หรือ Angular ได้กี่ตัว ดูเหมือนว่าเป็นความคิดที่สมบูรณ์แบบในการแยกส่วน UI และข้อมูลด้วย XSLT เป็นที่ยอมรับการใช้งานสามารถให้ผลลัพธ์ที่แตกต่างในบางกรณีมุม …

1
รหัสซ้ำซ้อนส่งไปป์ที่มีส่วนหน้าแบบไมโคร
ความเข้าใจของฉันเกี่ยวกับ Micro-frontends คือปัญหาสำคัญที่พวกเขาแก้ปัญหาคือการช่วยให้องค์กรมีทีมที่แตกต่างกันหลายทีมที่เป็นไปได้ทำงานกับแต่ละองค์ประกอบ / แอพขนาดเล็กที่จะใช้ในการเขียนเว็บแอปพลิเคชันขนาดใหญ่ นี่คือปัญหาสำคัญที่ต้องแก้ไขคือความสามารถของหลาย ๆ ทีมในการทำงานอย่างอิสระและยังสามารถสร้างคอมโพสิตขนาดใหญ่ ปัญหาคือไม่ได้เกี่ยวกับการมีกำปล่อยลีนสำหรับผู้ใช้ปลายทาง ความเข้าใจนั้นถูกต้องหรือไม่ เป็นความจริงหรือไม่ว่าหากเรามีแอปขนาดเล็กหลายตัวที่ใช้ในการเขียนแอปพลิเคชันเว็บขนาดใหญ่เราอาจมีแอพขนาดเล็กหลายตัวที่ส่งไลบรารี่ Javascript เดียวกัน ( เช่น Lodash ) ลงไปยังเบราว์เซอร์ของผู้ใช้ปลายทาง การรวมกลุ่มของผู้จัดจำหน่ายแต่ละรายซึ่งนำไปสู่รหัสซ้ำซ้อน / ซ้ำซ้อนจำนวนหนึ่งที่ถูกส่งไปยังผู้ใช้ นี่ไม่ใช่ความกังวลที่เราควรกังวลในขณะที่ออกแบบแอปพลิเคชันส่วนหน้าใช่ไหม

5
มันสมเหตุสมผลหรือไม่ที่จะนิยามอินเตอร์เฟสถ้าฉันมีคลาสนามธรรมอยู่แล้ว?
ฉันมีชั้นเรียนพร้อมฟังก์ชั่นเริ่มต้น / แชร์ ฉันใช้abstract classมัน public interface ITypeNameMapper { string Map(TypeDefinition typeDefinition); } public abstract class TypeNameMapper : ITypeNameMapper { public virtual string Map(TypeDefinition typeDefinition) { if (typeDefinition is ClassDefinition classDefinition) { return Map(classDefinition); } ... throw new ArgumentOutOfRangeException(nameof(typeDefinition)); } protected abstract string Map(ClassDefinition classDefinition); } ITypeNameMapperที่คุณสามารถดูฉันยังมีอินเตอร์เฟซ มันเหมาะสมหรือไม่ที่จะกำหนดอินเทอร์เฟซนี้ถ้าฉันมีคลาสนามธรรมTypeNameMapperหรือabstract classเพียงพอหรือไม่? TypeDefinition …

4
struct ด้วยค่าเริ่มต้นที่ไร้สาระ
ในระบบของฉันฉันมักทำงานกับรหัสสนามบิน ( "YYZ", "LAX", "SFO"ฯลฯ ) พวกเขามักจะอยู่ในรูปแบบเดียวกันแน่นอน (3 ตัวอักษรแสดงเป็นตัวพิมพ์ใหญ่) โดยทั่วไประบบจะจัดการกับ 25-50 ของรหัส (ต่างกัน) ต่อคำขอ API ด้วยการจัดสรรรวมกว่าพันรายการระบบจะส่งผ่านแอปพลิเคชันของเราหลายเลเยอร์และเปรียบเทียบกับความเท่าเทียมกันบ่อยครั้ง เราเริ่มต้นด้วยการส่งสายไปรอบ ๆ ซึ่งใช้งานได้ดี แต่เราก็สังเกตเห็นข้อผิดพลาดในการเขียนโปรแกรมจำนวนมากได้อย่างรวดเร็วโดยการส่งรหัสผิดไปที่ไหนสักแห่งคาดว่ารหัส 3 หลัก นอกจากนี้เรายังพบปัญหาที่เราควรทำการเปรียบเทียบแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ แต่ไม่ได้ทำให้เกิดข้อบกพร่อง จากนี้ฉันตัดสินใจที่จะหยุดการส่งผ่านสายไปรอบ ๆ และสร้างAirportชั้นเรียนซึ่งมีตัวสร้างเดียวที่ใช้และตรวจสอบรหัสสนามบิน public sealed class Airport { public Airport(string code) { if (code == null) { throw new ArgumentNullException(nameof(code)); } if (code.Length != 3 || …

5
ควรให้บริการมีข้อยกเว้นหรือส่งคืนเมื่อไม่มีรายการที่ระบุไว้สำหรับการลบ
ฉันมีโค้ดบางส่วนที่สามารถแสดงเป็น: public class ItemService { public void DeleteItems(IEnumerable<Item> items) { // Save us from possible NullReferenceException below. if(items == null) return; foreach(var item in items) { // For the purpose of this example, lets say I have to iterate over them. // Go to database and delete them. } } …

5
ในเงื่อนไขใด (ถ้ามี) มันเป็นการดีหรือไม่ที่จะค้นหาเซิร์ฟเวอร์สองเครื่องและใช้การตอบสนองที่เร็วที่สุดเท่านั้น
ฉันถามว่าตอนนี้คำถามที่ถูกลบโดยชุมชนในSOว่าทำไมใครบางคนจะใช้จาวาสคริปต์Promise.raceและผู้ใช้ตัวแทนระดับสูงแสดงความคิดเห็นนี้: หากคุณมีสองบริการที่คำนวณค่าบางอย่างคุณสามารถค้นหาทั้งสองแบบขนานและใช้ค่าที่เคยถูกส่งกลับมาก่อนแทนที่จะทำการสืบค้นหนึ่งรอความล้มเหลวจากนั้นทำการสอบถามครั้งที่สอง ฉันได้ค้นหาเกี่ยวกับความซ้ำซ้อนและกรณีการใช้งานทั่วไป แต่ฉันไม่พบอะไรเลยและจาก POV ของฉันมันไม่ควรที่จะเพิ่มปริมาณงานไปยังเซิร์ฟเวอร์ / บริการหากคุณไม่ต้องการใช้การตอบสนอง

1
มีวิธีใดในการสร้าง. Net library สำหรับ Windows และ Mac โดยอ้างอิงกับแพลตฟอร์ม
เรากำลังพยายามพัฒนาแอพข้ามแพลตฟอร์มสำหรับเดสก์ท็อป (Windows และ Mac) โดยใช้ C # แอพนี้มีสิ่งที่ขึ้นอยู่กับแพลตฟอร์มจำนวนมากและหัวหน้าทีมของเราต้องการให้เราเขียนโค้ดนั้นใน C # วิธีง่ายๆในการทำเช่นนี้คือการเขียน wrappers ใน C ++ และเพียงแค่อ้างอิงไลบรารีในโค้ด C # และปล่อยให้ไลบรารี C ++ จัดการกับแพลตฟอร์มสิ่ง ... อนิจจาไม่ควรเป็น ฉันกำลังพยายามตั้งค่าไลบรารีโดยใช้ Visual Studio สำหรับ Mac ฉันหวังว่าจะสามารถให้อินเทอร์เฟซเดียวในไลบรารีเดียวเพื่อให้เข้าถึงการเข้าถึงข้อความดั้งเดิมไปยังไลบรารีคำพูดบนแพลตฟอร์มปัจจุบัน - ดีกว่าโดยไม่ต้องมีสองแอสเซมบลี ไลบรารีการอ่านออกเสียงข้อความใน C # สำหรับ Windows ไม่สามารถใช้งานได้บน Mac ดังนั้นเราจึงไม่มีตัวเลือกอื่นนอกเหนือจากการให้บริการเชื่อมโยงกับตัวเรา ฉันมีความสุขที่ได้ให้ห้องสมุดทำการค้นหาระบบปฏิบัติการเพื่อพิจารณาว่าระบบปฏิบัติการใดที่ทำงานอยู่และ / หรือพยายามโหลดไลบรารี่ดั้งเดิมและใช้ไลบรารี่ที่เคยโหลดมาก่อน ถ้าฉันต้องมีโครงการเดียวที่จะช่วยให้ฉันเขียนการใช้งานสองจะต้องทำ ฉันไม่พบวิธีสร้างโครงการห้องสมุดใน Visual Studio สำหรับ Mac ที่จะอนุญาตให้ทำเช่นนั้น …

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