專利名稱:跨執(zhí)行環(huán)境保持?jǐn)?shù)據(jù)完整性的制作方法
技術(shù)領(lǐng)域:
本發(fā)明申請涉及在計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程中驗(yàn)證數(shù)據(jù),具體來講,涉及在非均質(zhì)執(zhí)行環(huán)境上傳遞數(shù)據(jù)的計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程中驗(yàn)證數(shù)據(jù)。
背景技術(shù):
當(dāng)前的計(jì)算解決方案通常包括一起工作以提供期望功能的多個模塊。這些模塊可以都位于單個計(jì)算設(shè)備上,不過,這些模塊在跨多個計(jì)算設(shè)備分布已成為常態(tài)。另外,分布式計(jì)算解決方案可以由不同類型和不同架構(gòu)的設(shè)備組成。盡管計(jì)算解決方案本質(zhì)上是非均質(zhì)的,但不同的模塊可能經(jīng)常被要求共享數(shù)據(jù)。由于數(shù)據(jù)在不同的模塊和環(huán)境中移動,必須驗(yàn)證數(shù)據(jù)處于正確或有效的表達(dá)。為此,可以定義管理數(shù)據(jù)的驗(yàn)證規(guī)則。為了執(zhí)行驗(yàn)證規(guī)則,可以將執(zhí)行環(huán)境特有的驗(yàn)證方法包含在每個模塊中。每當(dāng)管理數(shù)據(jù)的規(guī)則發(fā)生變化時(shí), 也必須改變與每個模塊相關(guān)的驗(yàn)證方法。如果所需的規(guī)則改變沒有傳達(dá)到所有的驗(yàn)證方法,會產(chǎn)生顯著的維護(hù)開銷,會導(dǎo)致潛在的錯誤。
發(fā)明內(nèi)容
在下文的說明中陳述了本發(fā)明申請的其他特征和優(yōu)點(diǎn),部分特征和優(yōu)點(diǎn)在說明中會變得明顯,或者通過本文公開的原則的實(shí)現(xiàn)而可以為人所了解。通過所附權(quán)利要求中特別指出的儀器和組合,可以實(shí)現(xiàn)和得到本發(fā)明申請的特征和優(yōu)點(diǎn)。通過下文的說明和所附的權(quán)利要求,本發(fā)明申請的這些和其他特征會變得清楚,或者,通過本文所陳述的原則的實(shí)現(xiàn),可以了解本發(fā)明申請的這些和其他特征。本文公開的是用于跨非均質(zhì)執(zhí)行環(huán)境保持?jǐn)?shù)據(jù)完整性的系統(tǒng)、方法以及非臨時(shí)性計(jì)算機(jī)可讀存儲媒介。當(dāng)前的計(jì)算解決方案通常包括跨多個計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程共享數(shù)據(jù)。 由于數(shù)據(jù)在多個計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程之間以及可能在不同的存儲位置之間移動,必須確保數(shù)據(jù)處于正確或有效的表達(dá)。為了解決這個與添加和保持多個驗(yàn)證校驗(yàn)的局限,可以將數(shù)據(jù)和驗(yàn)證規(guī)則封裝在可以在多個計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程之間傳遞的數(shù)據(jù)對象中。數(shù)據(jù)對象可以由數(shù)據(jù)和一個或多個驗(yàn)證對象組成。驗(yàn)證對象可以指定單個“驗(yàn)證” 函數(shù),該驗(yàn)證函數(shù)執(zhí)行完成一個或多個與數(shù)據(jù)相關(guān)的驗(yàn)證規(guī)則的動作。計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程采用數(shù)據(jù)對象而不是裸數(shù)據(jù)執(zhí)行來自進(jìn)程外部的數(shù)據(jù)請求以及將數(shù)據(jù)傳送出進(jìn)程。為了有利于創(chuàng)建數(shù)據(jù)對象,在執(zhí)行環(huán)境中可以存在一個或多個數(shù)據(jù)提供者。數(shù)據(jù)提供者可以是數(shù)據(jù)進(jìn)出正在執(zhí)行的計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程的通道。數(shù)據(jù)提供者可以指定兩個函數(shù)“retrieveDataObject”函數(shù)和“storeDataObject”函數(shù)?;跈z索數(shù)據(jù)的請求,數(shù)據(jù)提供者獲取被請求的數(shù)據(jù)以及一個或多個驗(yàn)證對象。可以基于保持在數(shù)據(jù)提供者中的驗(yàn)證規(guī)則創(chuàng)建驗(yàn)證對象。基于存儲數(shù)據(jù)對象的請求,數(shù)據(jù)提供者可以更新數(shù)據(jù)存儲位置和/或驗(yàn)證規(guī)則。在執(zhí)行的任何點(diǎn)上,可以請求驗(yàn)證包含在數(shù)據(jù)對象中的數(shù)據(jù)。可以直接向數(shù)據(jù)對象發(fā)起驗(yàn)證請求。一旦接收到驗(yàn)證請求,數(shù)據(jù)對象可以指令每個驗(yàn)證對象測試數(shù)據(jù)的有效性。數(shù)據(jù)對象可以收集驗(yàn)證校驗(yàn)的結(jié)果,并將這些結(jié)果返回至發(fā)起請求的計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程。為了解決多個執(zhí)行環(huán)境的非均質(zhì)本質(zhì),數(shù)據(jù)對象可以包括輸出功能,其中,數(shù)據(jù)對象可以創(chuàng)建適于目標(biāo)計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程的自身表達(dá)。一旦接收到輸出請求,數(shù)據(jù)對象指令每個驗(yàn)證對象創(chuàng)建自身的適當(dāng)驗(yàn)證對象表達(dá)。然后,封裝新的驗(yàn)證對象和數(shù)據(jù),以創(chuàng)建用于目標(biāo)計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程的可輸出數(shù)據(jù)對象。當(dāng)輸出的數(shù)據(jù)對象到達(dá)目標(biāo)計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程,該進(jìn)程可以存取該數(shù)據(jù)并基于為源進(jìn)程定義的同一驗(yàn)證規(guī)則對該數(shù)據(jù)進(jìn)行驗(yàn)證。
參照附圖中所示出的特定實(shí)施例,將對上文簡單描述的原則進(jìn)行更具體的說明, 以對獲得本發(fā)明公開的上述優(yōu)點(diǎn)和特征以及其他優(yōu)點(diǎn)和特征的方式進(jìn)行說明。應(yīng)當(dāng)理解的是,這些附圖只是描述了本發(fā)明公開的示例性實(shí)施例,而不是對本發(fā)明公開范圍的限制。通過這些附圖,對本發(fā)明的原則進(jìn)行了更詳盡的說明和解釋,其中圖I示出了示例性的執(zhí)行環(huán)境;
圖2示出了示例性的數(shù)據(jù)對象;
圖3示出了示例性的數(shù)據(jù)檢索方法;
圖4示出了示例性的數(shù)據(jù)存儲方法;
圖5示出了示例性的數(shù)據(jù)驗(yàn)證方法;
圖6示出了示例性的數(shù)據(jù)輸出方法;
圖7示出了用于跨執(zhí)行環(huán)境保持?jǐn)?shù)據(jù)完整性的示例性方法實(shí)施例;以及
圖8示出了示例性的系統(tǒng)實(shí)施例。
具體實(shí)施方式
下文將對本發(fā)明公開中的各種實(shí)施例進(jìn)行詳細(xì)的討論。在討論具體的實(shí)施方式
時(shí),應(yīng)當(dāng)理解的是,這些實(shí)施方式僅僅是出于說明目的而給出的。相關(guān)領(lǐng)域的技術(shù)人員可以意識到,在不脫離本發(fā)明公開的精神和范圍的情況下,可以采用其他的部件和配置。本發(fā)明公開解決了本領(lǐng)域中對在不同計(jì)算環(huán)境之間移動數(shù)據(jù)時(shí)校驗(yàn)數(shù)據(jù)完整性的方法的需要。在圖I中示出了示例性的執(zhí)行環(huán)境100,其中,計(jì)算機(jī)實(shí)現(xiàn)的多個進(jìn)程104、 106、108和110以及存儲設(shè)備112均使用數(shù)據(jù)102。在圖I中,計(jì)算機(jī)實(shí)現(xiàn)的每個進(jìn)程104、 106,108和110可以讀取和/或編輯數(shù)據(jù)102、發(fā)送數(shù)據(jù)102至計(jì)算機(jī)實(shí)現(xiàn)的另一個進(jìn)程或接收來自計(jì)算機(jī)實(shí)現(xiàn)的另一個進(jìn)程的數(shù)據(jù)102、和/或向存儲設(shè)備112請求數(shù)據(jù)102或?qū)?shù)據(jù)102保存到存儲設(shè)備112。在某些配置中,可以在單個計(jì)算設(shè)備中執(zhí)行計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程104、106、108和 110。不過,還可以在通過網(wǎng)絡(luò)進(jìn)行通信的一個或多個計(jì)算設(shè)備中執(zhí)行計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程。 另外,所述一個或多個計(jì)算設(shè)備可以是不同類型的,例如服務(wù)器、臺式計(jì)算機(jī)、移動式計(jì)算機(jī)、諸如移動電話、智能電話、平板電腦之類的手持通信設(shè)備、和/或其他類型的計(jì)算設(shè)備。 另外,存儲設(shè)備可以位于與計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程中的一個或多個進(jìn)程相同的同一臺計(jì)算設(shè)備上,或者,存儲設(shè)備可以位于不同的計(jì)算設(shè)備上,例如服務(wù)器或外部硬盤驅(qū)動器上。執(zhí)行環(huán)境100可以被配置為用于有助于電子設(shè)備之間通信的局域網(wǎng)或任何其他網(wǎng)絡(luò)配置上。例如,執(zhí)行環(huán)境100中的每個部件可以在網(wǎng)絡(luò)上以局部方式或分布方式實(shí)現(xiàn)。 本領(lǐng)域技術(shù)人員應(yīng)當(dāng)清楚的是,執(zhí)行環(huán)境100可以包括計(jì)算機(jī)實(shí)現(xiàn)的任意數(shù)量的進(jìn)程、存儲設(shè)備和/或數(shù)據(jù)段,而且,不是計(jì)算機(jī)實(shí)現(xiàn)的所有進(jìn)程和/或存儲設(shè)備都可以利用特定的數(shù)據(jù)項(xiàng)。圖I中示出的執(zhí)行環(huán)境100可以是當(dāng)前計(jì)算解決方案中的通常配置。也就是說, 在一個或多個計(jì)算設(shè)備上執(zhí)行的計(jì)算機(jī)實(shí)現(xiàn)的一個或多個進(jìn)程利用同一數(shù)據(jù)是常見的。例如,計(jì)算機(jī)實(shí)現(xiàn)的一個進(jìn)程可以被用來從用戶采集數(shù)據(jù),而計(jì)算機(jī)實(shí)現(xiàn)的第二個進(jìn)程可以在一個任務(wù)中使用這個數(shù)據(jù)。另外,計(jì)算機(jī)實(shí)現(xiàn)的第一個進(jìn)程可以采集數(shù)據(jù),并將數(shù)據(jù)存儲到數(shù)據(jù)庫或文件中。計(jì)算機(jī)實(shí)現(xiàn)的第二個進(jìn)程在使用數(shù)據(jù)之前可以從數(shù)據(jù)庫或文件中取回?cái)?shù)據(jù)。在采集、存儲、取回、使用過程的每個階段,數(shù)據(jù)可能由于不當(dāng)表達(dá)而結(jié)束。不當(dāng)表達(dá)可能由多個因素引起,例如,用戶輸入的數(shù)據(jù)不符合要求,或數(shù)據(jù)已損毀。當(dāng)前用來確保數(shù)據(jù)正確表達(dá)或有效表達(dá)的解決方案是定義管理數(shù)據(jù)的驗(yàn)證規(guī)則。 基于這些驗(yàn)證規(guī)則,可以實(shí)現(xiàn)驗(yàn)證校驗(yàn),并將驗(yàn)證校驗(yàn)加入到負(fù)責(zé)采集數(shù)據(jù)的計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程中。不幸的是,除非在系統(tǒng)中的多個點(diǎn)上加入驗(yàn)證校驗(yàn),不然,系統(tǒng)仍會嘗試采用不當(dāng)形式的數(shù)據(jù)。從而,還應(yīng)當(dāng)將驗(yàn)證校驗(yàn)加入到計(jì)算機(jī)實(shí)現(xiàn)的以某種方式利用這些數(shù)據(jù)的任何進(jìn)程中。基于這個解決方案,需要將驗(yàn)證校驗(yàn)加入到計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程104、106、108 和110中,而且,根據(jù)存儲設(shè)備的類型,還可以將驗(yàn)證校驗(yàn)加入到存儲設(shè)備112中。采用這種解決方案,每當(dāng)管理數(shù)據(jù)的驗(yàn)證規(guī)則發(fā)生變化時(shí),必須對計(jì)算機(jī)實(shí)現(xiàn)的包括驗(yàn)證校驗(yàn)的每個進(jìn)程進(jìn)行更新。更新過程會消耗時(shí)間,并容易產(chǎn)生錯誤。另外,在必須保持多個驗(yàn)證校驗(yàn)實(shí)現(xiàn)的非均質(zhì)執(zhí)行環(huán)境中,維護(hù)開銷(maintenance overhead)會變得更加復(fù)雜。為了說明基于上述驗(yàn)證解決方案的執(zhí)行環(huán)境100的可行應(yīng)用,假定數(shù)據(jù)102是從一個執(zhí)行環(huán)境轉(zhuǎn)移至另一個執(zhí)行環(huán)境的客戶記錄??蛻粲涗浛梢园糜诳蛻綦娮余]件地址的字段。為了確保所提供的電子郵件地址是正確的,可以定義一種驗(yàn)證規(guī)則,要求數(shù)據(jù)包含一個符號。可以從服務(wù)器執(zhí)行的web應(yīng)用程序檢索客戶數(shù)據(jù)??梢杂迷诜?wù)器執(zhí)行環(huán)境中運(yùn)行的代碼實(shí)現(xiàn)用于有效電子郵件字段的校驗(yàn)。服務(wù)器可以將作為web應(yīng)用程序一部分的HTML和JavaScript代碼發(fā)送到用戶的瀏覽器,這些代碼實(shí)現(xiàn)了顯示給用戶的網(wǎng)頁。 對于能夠查看和操作客戶數(shù)據(jù)的用戶來講,代碼被發(fā)送到網(wǎng)頁瀏覽器的執(zhí)行環(huán)境。在瀏覽器執(zhí)行環(huán)境中加入第二驗(yàn)證校驗(yàn),以增強(qiáng)電子郵件字段規(guī)則。通過將驗(yàn)證規(guī)則和數(shù)據(jù)封裝在一個數(shù)據(jù)對象中,可以改善上文所述的驗(yàn)證解決方案。通過這種封裝,可以將所有的驗(yàn)證校驗(yàn)包含在一個位置中。從而,只要驗(yàn)證規(guī)則發(fā)生改變,就可以很容易地識別和更新所有的校驗(yàn)。這可以減少所需的維護(hù)量,并降低與更新一個或多個驗(yàn)證校驗(yàn)失敗相關(guān)的錯誤風(fēng)險(xiǎn)。圖2示出了示例性的數(shù)據(jù)對象200。數(shù)據(jù)對象200可以由數(shù)據(jù)202和一個或多個驗(yàn)證對象204組成。包含在數(shù)據(jù)對象200中的數(shù)據(jù)類型可以根據(jù)執(zhí)行環(huán)境的配置而發(fā)生變化。在某些情況下,數(shù)據(jù)可以是原始數(shù)據(jù),正在執(zhí)行的采用這些數(shù)據(jù)的計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程可以負(fù)責(zé)對數(shù)據(jù)進(jìn)行分析并提取計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程所需的信息。在另外一些情況下,數(shù)據(jù)可以采用特定的格式。在某些情況下,包含在數(shù)據(jù)對象中的數(shù)據(jù)大小可以很大。在另外一些情況下,數(shù)據(jù)大小可以很小。例如,數(shù)據(jù)對象中的數(shù)據(jù)可以是所有的客戶記錄、某一特定時(shí)期的客戶記錄、與單個客戶相關(guān)的記錄、客戶記錄中的單個字段、等等。驗(yàn)證對象可以指定單個“驗(yàn)證”函數(shù),該“驗(yàn)證”函數(shù)執(zhí)行完成一個或多個驗(yàn)證規(guī)則的動作。該“驗(yàn)證”函數(shù)可以被配置,使得驗(yàn)證對象只驗(yàn)證數(shù)據(jù)的單個方面,例如客戶記錄中的電子郵件字段??商鎿Q地,“驗(yàn)證”函數(shù)可以被配置來驗(yàn)證數(shù)據(jù)的多個方面或整個數(shù)據(jù)。例如,驗(yàn)證對象可以被配置來確保數(shù)據(jù)中的字段的總量不超過某一預(yù)定值。采用任何可編程語言實(shí)現(xiàn)驗(yàn)證對象,例如,Java、C++等。例如,下列代碼示出了用于實(shí)現(xiàn)驗(yàn)證對象的可行接口。public interface ValidationObject{public void validate(DataObject dataObject);}在這個例子中,為了實(shí)現(xiàn)驗(yàn)證對象,用戶可以簡單地實(shí)現(xiàn)采用單個數(shù)據(jù)對象作為參數(shù)的“驗(yàn)證”函數(shù)。實(shí)現(xiàn)驗(yàn)證對象的其他方法也是可行的。例如,其他參數(shù)也是可行的, 和/或代替?zhèn)鬟f數(shù)據(jù)對象,可以將實(shí)際數(shù)據(jù)作為參數(shù)傳遞。另外,用戶不局限于采用單個編程語言來實(shí)現(xiàn)與單個數(shù)據(jù)集相關(guān)的所有驗(yàn)證對象,可以采用多個編程語言來實(shí)現(xiàn)這些驗(yàn)證對象。與驗(yàn)證對象一樣,可以采用任何一種編程語言來實(shí)現(xiàn)數(shù)據(jù)對象,例如Java、C++
等。例如,下列代碼示出了實(shí)現(xiàn)數(shù)據(jù)對象的可行的類的基本因素。
public class Dataobject {
private List data = new List(); private List validators = new ListQ;
public addData(Data data) { data.add(data);
public List getData() {
權(quán)利要求
1.一種計(jì)算機(jī)實(shí)現(xiàn)的方法,其包括關(guān)聯(lián)至少一個驗(yàn)證對象和數(shù)據(jù)集;從至少一個正在執(zhí)行的進(jìn)程接收對數(shù)據(jù)集的請求;將所述數(shù)據(jù)集和所述至少一個驗(yàn)證對象封裝在數(shù)據(jù)對象中;以及將所述數(shù)據(jù)對象發(fā)送到所述至少一個正在執(zhí)行的進(jìn)程。
2.根據(jù)權(quán)利要求I所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其還包括關(guān)聯(lián)至少一個驗(yàn)證對象、數(shù)據(jù)集和至少一個管理數(shù)據(jù)集應(yīng)用的驗(yàn)證規(guī)則。
3.根據(jù)權(quán)利要求I或權(quán)利要求2所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中,所述數(shù)據(jù)對象能夠提供所述數(shù)據(jù)對象對至少一個正在執(zhí)行的進(jìn)程的表達(dá)。
4.根據(jù)權(quán)利要求I至3中的任何一項(xiàng)所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中,所述驗(yàn)證對象包括用于執(zhí)行所述至少一個驗(yàn)證規(guī)則的驗(yàn)證函數(shù)。
5.根據(jù)權(quán)利要求I所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其還包括產(chǎn)生所述數(shù)據(jù)對象的表達(dá);其中,接收包括從至少兩個正在執(zhí)行的進(jìn)程接收對數(shù)據(jù)集的請求;其中,發(fā)送包括向所述至少兩個正在執(zhí)行的進(jìn)程發(fā)送所述數(shù)據(jù)對象的表達(dá)。
6.根據(jù)權(quán)利要求5所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中,所述數(shù)據(jù)對象的表達(dá)被提供給用至少兩種編程語言實(shí)現(xiàn)的至少兩個正在執(zhí)行的進(jìn)程。
7.根據(jù)權(quán)利要求I至6中的任何一項(xiàng)權(quán)利要求所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其還包括 接收存儲所述數(shù)據(jù)對象的請求;以及存儲所述數(shù)據(jù)對象。
8.一種計(jì)算機(jī)實(shí)現(xiàn)的方法,其包括從至少一個正在執(zhí)行的進(jìn)程發(fā)送對數(shù)據(jù)集的請求;在所述至少一個正在執(zhí)行的進(jìn)程接收數(shù)據(jù)對象的表達(dá),所述數(shù)據(jù)對象包括數(shù)據(jù)集和至少一個驗(yàn)證對象,其中,所述驗(yàn)證對象包括用于執(zhí)行管理所述數(shù)據(jù)集應(yīng)用的至少一種驗(yàn)證規(guī)則的驗(yàn)證函數(shù);以及應(yīng)用所述至少一種驗(yàn)證規(guī)則來執(zhí)行所述至少一個正在執(zhí)行的進(jìn)程。
9.一種計(jì)算機(jī)可讀媒介,其包括存儲在所述計(jì)算機(jī)可讀媒介上的用來使計(jì)算機(jī)執(zhí)行權(quán)利要求I至8中的任何一項(xiàng)所述的計(jì)算機(jī)實(shí)現(xiàn)的方法的計(jì)算機(jī)可讀代碼。
10.一種包含處理器的設(shè)備,所述處理器被配置來執(zhí)行權(quán)利要求I至8中的任何一項(xiàng)所述的計(jì)算機(jī)實(shí)現(xiàn)的方法。
全文摘要
當(dāng)前的計(jì)算解決方案通常包括多個計(jì)算機(jī)實(shí)現(xiàn)的進(jìn)程之間的數(shù)據(jù)共享。為了確保在整個執(zhí)行環(huán)境上的數(shù)據(jù)完整性,正在執(zhí)行的進(jìn)程可以向數(shù)據(jù)提供者請求數(shù)據(jù)。響應(yīng)于這種請求,數(shù)據(jù)提供者可以將數(shù)據(jù)和一個或多個驗(yàn)證對象打包在一個數(shù)據(jù)對象中??梢栽谡趫?zhí)行的進(jìn)程之間傳遞數(shù)據(jù)對象,而且,在執(zhí)行中的任何點(diǎn)上,通過向數(shù)據(jù)對象發(fā)起請求,正在執(zhí)行的進(jìn)程可以驗(yàn)證數(shù)據(jù)的完整性。為了有助于在非均質(zhì)執(zhí)行環(huán)境上傳遞數(shù)據(jù)對象,數(shù)據(jù)對象可以創(chuàng)建它自身為目標(biāo)系統(tǒng)獨(dú)有的表達(dá)。數(shù)據(jù)對象的優(yōu)勢在于,所有必須的驗(yàn)證校驗(yàn)是集中的,從而降低了維護(hù)成本和錯誤概率。
文檔編號G06F17/00GK102612683SQ201080046792
公開日2012年7月25日 申請日期2010年10月8日 優(yōu)先權(quán)日2009年10月16日
發(fā)明者林賽·伊恩·史密斯, 沙恩·安德魯·莫薩, 約翰·馬修·馬丁 申請人:核心科技有限公司