可對介面編程
『壹』 什麼是編程介面呢具體有什麼作用
1.編程介面就是對於某種邏輯寫的一定規范的數據格式,
就是宿主程序跟 Lu通訊用的一組 C 函數。 所有的 API 函數按相關的類型以及常量都聲明在頭文件 lua.h 中。
2.雖然我們說的是「函數」, 但一部分簡單的 API 是以宏的形式提供的。
除非另有說明, 所有的這些宏都只使用它們的參數一次 (除了第一個參數,那一定是 Lu狀態), 因此你不需擔心這些宏的展開會引起一些副作用。
3.C 庫中所有的 Lua API 函數都不去檢查參數是否相容及有效。
然而,你可以在編譯 Lu 時加上打開一個宏開關 LUA_USE_APICHECK 來改變這個行為。
Lu使用一個 虛擬棧 來和 C 互傳值。 棧上的的每個元素都是一個 Lu 值 (nil,數字,字元串,等等)。
4.無論何時 Lua 調用 C,被調用的函數都得到一個新的棧,
這個棧獨立於 C 函數本身的棧,也獨立於之前的 Lu棧。 它裡麵包含了 Lu傳遞給 C 函數的所有參數, 而 C 函數則把要返回的結果放入這個棧以返回給調用者。
5.方便起見, 所有針對棧的 API 查詢操作都不嚴格遵循棧的操作規則。
而是可以用一個 索引 來指向棧上的任何元素: 正的索引指的是棧上的絕對位置(從1開始); 負的索引則指從棧頂開始的偏移量。 展開來說,如果堆棧有 n 個元素, 那麼索引 1 表示第一個元素 (也就是最先被壓棧的元素) 而索引 n 則指最後一個元素; 索引 -1 也是指最後一個元素 (即棧頂的元素), 索引 -n 是指第一個元素。
4.2 – 棧大小
5.當你使用 Lu API 時, 就有責任保證做恰當的調用。 特別需要注意的是, 你有責任控制不要堆棧溢
『貳』 如何理解「針對介面編程,而不是針對實現編程」
通過介面來調用一個類及其方法,而不是直接建立類實體來調用類。
比如將來你要把這個被調用的類換成一個別的實現類時,你就不用去把調用過它的類一個個改掉了,因為它們調的是介面,介面沒變,在配置里把介面的實現類換成新的類,就全部都替換掉了
這就是解耦,提高可維護性
『叄』 java中什麼是針對介面編程請舉個例子(求助大神啊)
通過介面來調用一個類及其方法,而不是直接建立類實體來調用類。
比如將來你要把這個被調用的類換成一個別的實現類時,你就不用去把調用過它的類一個個改掉了,因為它們調的是介面,介面沒變,在配置里把介面的實現類換成新的類,就全部都替換掉了
這就是解耦,提高可維護性
interface 動物 {
void 叫();
}
class 狗 implements 動物 {
void 叫() {
System.out.println("汪");
}
}
class 貓 implements 動物 {
void 叫() {
System.out.println("喵");
}
}
class test{
private 動物 我的寵物;
public static void main() {
我的寵物.叫();
}
}
現在你可以把我的寵物隨便換成狗類或貓類都行了,main方法不用改。
針對實現編程就是
new 狗();
狗.叫();
換了貓再改一次main方法
『肆』 什麼叫面向介面編程以及面向介面編程的好處
在一個面向對象的系統中,系統的各種功能是由許許多多的不同對象協作完成的。在這種情況下,各個對象內部是如何實現自己的對系統設計人員來講就不那麼重要了;而各個對象之間的協作關系則成為系統設計的關鍵。小到不同類之間的通信,大到各模塊之間的交互,在系統設計之初都是要著重考慮的,這也是系統設計的主要工作內容。面向介面編程就是指按照這種思想來編程。 寫小的應用程序看不到介面的優勢,寫大點的程序馬上就顯示出介面的優勢,越大越明顯.所以還是從現在開始養成面向介面編程的習慣.寫多了程序就會覺得優勢顯而易見.
『伍』 在VC++如何對微機的介面進行編程
對於串口的使用,可以使用winapi,這里使用串口就像文件的讀寫,在開始打開串口,然後讀寫數據,結束後關閉串口.
在VC++中,串口和磁碟文件可以統一的方式來簡單讀寫。這兩者幾乎沒有什麼不同,只是在WINDOWS 9X下磁碟文件只能做同步訪問,而串口只能做非同步訪問。
CreateFile:用指定的方式打開指定的串口。通常的方式為
m_hCom = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL );
m_hCom為文件句柄。GENERIC_READ | GENERIC_WRITE指定可以對串口進行讀寫操作。第三個參數0表示串口為獨占打開。OPEN_EXISTING表示當指定串口不存在時,程序將返回失敗。 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED則表示文件屬性。當打開串口時,必須指定 FILE_FLAG_OVERLAPPED,它表示文件或設備不會維護訪問指針,則在讀寫時,必須使用OVERLAPPED 結構指定訪問的文件偏移量。
ReadFile:讀取串口數據。
WriteFile:向串口寫數據。
CloseHandle:關閉串口。
COMMTIMEOUTS:COMMTIMEOUTS主要用於串口超時參數設置。COMMTIMEOUTS結構如下:
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout;
DWORD ReadTotalTimeoutMultiplier;
DWORD ReadTotalTimeoutConstant;
DWORD WriteTotalTimeoutMultiplier;
DWORD WriteTotalTimeoutConstant;
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
ReadIntervalTimeout:兩字元之間最大的延時,當讀取串口數據時,一旦兩個字元傳輸的時間差超過該時間,讀取函數將返回現有的數據。設置為0表示該參數不起作用。
ReadTotalTimeoutMultiplier:讀取每字元間的超時。
ReadTotalTimeoutConstant:一次讀取串口數據的固定超時。所以在一次讀取串口的操作中,其超時為ReadTotalTimeoutMultiplier乘以讀取的位元組數再加上 ReadTotalTimeoutConstant。將ReadIntervalTimeout設置為MAXDWORD,並將ReadTotalTimeoutMultiplier 和ReadTotalTimeoutConstant設置為0,表示讀取操作將立即返回存放在輸入緩沖區的字元。
WriteTotalTimeoutMultiplier:寫入每字元間的超時。
WriteTotalTimeoutConstant:一次寫入串口數據的固定超時。所以在一次寫入串口的操作中,其超時為WriteTotalTimeoutMultiplier乘以寫入的位元組數再加上 WriteTotalTimeoutConstant。
SetCommTimeouts函數可以設置某設備句柄的超時參數,要得到某設備句柄的超時參數可以用GetCommTimeouts函數。
DCB:DCB結構主要用於串口參數設置。該結構太龐大,這里就不一一講述了,有興趣者可查看MSDN關於DCB的描述。其中下面兩個是比較重要的屬性。
BaudRate:串口的通訊速度。一般設置為9600。
ByteSize:位元組位數。一般設置為8。
DCB結構可以用SetCommState函數來設置,並可以用GetCommState來得到現有串口的屬性。
SetupComm:設置串口輸入、輸出緩沖區。
OVERLAPPED:保存串口非同步通訊的信息。具體結構如下:
typedef struct _OVERLAPPED {
DWORD Internal;
DWORD InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
HANDLE hEvent;
} OVERLAPPED;
Internal,InternalHigh是保留給系統使用的,用戶不需要設置。
Offset,OffsetHigh是讀寫串口的偏移量,一般設置OffsetHigh為NULL,可以支持2GB數據。
hEvent讀寫事件,因為串口是非同步通訊,操作可能被其他進程堵塞,程序可以通過檢查該時間來得知是否讀寫完畢。事件將在讀寫完成後,自動設置為有效。
通過以上這些函數和結構,我們就可以通過串口進行通訊了,現在我們具體看下面的實例:
BOOL CSerial::Open( int nPort, int nBaud )
{
if( m_bOpened ) return( TRUE );
char szPort[15];
DCB dcb;
wsprintf( szPort, "COM%d", nPort );
m_hComDev = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL );
if( m_hComDev == NULL ) return( FALSE );
memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 5000;
SetCommTimeouts( m_hComDev, &CommTimeOuts );
m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
dcb.DCBlength = sizeof( DCB );
GetCommState( m_hComDev, &dcb );
dcb.BaudRate = nBaud;
dcb.ByteSize = 8;
if( !SetCommState( m_hComDev, &dcb ) ||
!SetupComm( m_hComDev, 10000, 10000 ) ||
m_OverlappedRead.hEvent == NULL ||
m_OverlappedWrite.hEvent == NULL ){
DWORD dwError = GetLastError();
if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );
if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent );
CloseHandle( m_hComDev );
return FALSE;
}
m_bOpened = TRUE;
return m_bOpened;
}
int CSerial::InBufferCount( void )
{
if( !m_bOpened || m_hComDev == NULL ) return( 0 );
DWORD dwErrorFlags;
COMSTAT ComStat;
ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
return (int)ComStat.cbInQue;
}
DWORD CSerial::ReadData( void *buffer, DWORD dwBytesRead)
{
if( !m_bOpened || m_hComDev == NULL ) return 0;
BOOL bReadStatus;
DWORD dwErrorFlags;
COMSTAT ComStat;
ClearCommError( m_hComDev, &dwErrorFlags, &ComStat );
if( !ComStat.cbInQue ) return 0;
dwBytesRead = min(dwBytesRead,(DWORD) ComStat.cbInQue);
bReadStatus = ReadFile( m_hComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead );
if( !bReadStatus ){
if( GetLastError() == ERROR_IO_PENDING ){
WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
return dwBytesRead;
}
return 0;
}
return dwBytesRead;
}
DWORD CSerial::SendData( const char *buffer, DWORD dwBytesWritten)
{
if( !m_bOpened || m_hComDev == NULL ) return( 0 );
BOOL bWriteStat;
bWriteStat = WriteFile( m_hComDev, buffer, dwBytesWritten, &dwBytesWritten, &m_OverlappedWrite );
if( !bWriteStat){
if ( GetLastError() == ERROR_IO_PENDING ) {
WaitForSingleObject( m_OverlappedWrite.hEvent, 1000 );
return dwBytesWritten;
}
return 0;
}
return dwBytesWritten;
}
『陸』 面向介面編程的基本信息
在一個面向對象的系統中,系統的各種功能是由許許多多的不同對象協作完成的。在這種情況下,各個對象內部是如何實現自己的,對系統設計人員來講就不那麼重要了;而各個對象之間的協作關系則成為系統設計的關鍵。小到不同類之間的通信,大到各模塊之間的交互,在系統設計之初都是要著重考慮的,這也是系統設計的主要工作內容。面向介面編程就是指按照這種思想來編程。
1.關於介面的理解。
介面從更深層次的理解,應是定義(規范,約束)與實現(名實分離的原則)的分離。
介面的本身反映了系統設計人員對系統的抽象理解。
介面應有兩類:第一類是對一個體的抽象,它可對應為一個抽象體(abstract class);
第二類是對一個體某一方面的抽象,即形成一個抽象面(interface);
一個體有可能有多個抽象面。
抽象體與抽象面是有區別的。
2.設計介面的另一個不可忽視的因素是介面所處的環境(context,environment),系統論的觀點:環境是系統要素所處的空間與外部影響因素的總和。任何介面都是在一定的環境中產生的。因此環境的定義及環境的變化對介面的影響是不容忽視的,脫離原先的環境,所有的介面將失去原有的意義。
3.按照組件的開發模型(3C),它們三者相輔相成,各司一面,渾然一體,缺一不可。
面向對象是指,我們考慮問題時,以對象為單位,考慮它的屬性及方法
面向過程是指,我們考慮問題時,以一個具體的流程(事務過程)為單位,考慮它的實現
介面設計與非介面設計是針對復用技術而言的,與面向對象(過程)不是一個問題
UML裡面所說的interface是協議的另一種說法。並不是指com的interface,CORBA的interface,Java的interface,Delphi的interface,人機界面的interface或NIC的interface。
在具體實現中,是可以把UML的interface實現為語言的interface,分布式對象環境的interface或其它什麼interface,但就理解UML的interface而言,指的是系統每部分的實現和實現之間,通過interface所確定的協議來共同工作。
面向interface編程,原意是指面向抽象協議編程,實現者在實現時要嚴格按協議來辦。面向對象編程是指面向抽象和具象。抽象和具象是矛盾的統一體,不可能只有抽象沒有具象。一般懂得抽象的人都明白這個道理。 但有的人只知具象卻不知抽象為何物。 所以只有interface沒有實現,或只有實現而沒有interface者是沒有用的,反OO的。
所以還是老老實實面向對象編程,面向協議編程,或者什麼都不面向,老老實實編程。
但是我很討厭討論這樣的術語,不如我們談談什麼叫面向領導的編程?面向用戶的編程?領導和用戶有時都很BT,我們就面向BT編程?
選擇Java介面還是抽象類
很多人有過這樣的疑問:為什麼有的地方必須使用介面而不是抽象類,而在另一些地方,又必須使用抽象類而不是介面呢?或者說,在考慮Java類的一般化問題時,很多人會在介面和抽象類之間猶豫不決,甚至隨便選擇一種。
實際上介面和抽象類的選擇不是隨心所欲的。要理解介面和抽象類的選擇原則,有兩個概念很重要:對象的行為和對象的實現。如果一個實體可以有多種實現方式,則在設計實體行為的描述方式時,應當達到這樣一個目標:在使用實體的時候,無需詳細了解實體行為的實現方式。也就是說,要把對象的行為和對象的實現分離開來。既然Java的介面和抽象類都可以定義不提供具體實現的方法,在分離對象的行為和對象的實現時,到底應該使用介面還是使用抽象類呢?
通過抽象類建立行為模型
在介面和抽象類的選擇上,必須遵守這樣一個原則:行為模型應該總是通過介面而不是抽象類定義。為了說明其原因,下面試著通過抽象類建立行為模型,看看會出現什麼問題。
假設要為銷售部門設計一個軟體,這個軟體包含一個「發動機」(Motor)實體。顯然無法在發動機對象中詳細地描述發動機的方方面面,只能描述某些對當前軟體來說重要的特徵。至於發動機的哪些特徵是重要的,則要與用戶(銷售部門)交流才能確定。
銷售部門的人要求每一個發動機都有一個稱為馬力的參數。對於他們來說,這是惟一值得關心的參數。基於這一判斷,可以把發動機的行為定義為以下行為。
行為1:查詢發動機的馬力,發動機將返回一個表示馬力的整數。
雖然還不清楚發動機如何取得馬力這個參數,但可以肯定發動機一定支持這個行為,而且這是所有發動機惟一值得關注的行為特徵。這個行為特徵既可以用介面定義,也可以用抽象類定義。為了說明用抽象類定義可能出現的問題,下面用抽象類建立發動機的行為模型,並用Java方法描述行為1,代碼如下:
代碼
public abstract Motor{
abstract public int getHorsepower();
}
在Motor抽象類的基礎上構造出多種具體實現,例如A型發動機、B型發動機等,再加上系統的其它部分,最後得到1.0版的軟體並交付使用。一段時間過去了,要設計2.0版的軟體。在評估2.0版軟體需求的過程中,發現一小部分發動機是電池驅動的,而電池需要一定的充電時間。銷售部門的人希望能夠通過計算機查閱充電時間。根據這一要求定義一個新的行為,如圖1所示。
行為2:查詢電驅動發動機的充電時間,發動機將返回一個表示充電時間的整數。
用Java方法來描述這個行為,代碼如下:
代碼
public abstract BatteryPoweredMotor extends Motor{
abstract public int getTimeToRecharge();
}
在銷售部門的軟體中,電驅動發動機也以類的形式實現,但這些類從BatteryPoweredMotor而不是Motor派生。這些改動加入到2.0版軟體之後,銷售部門很滿意。隨著業務的不斷發展,不久之後光碟機動的發動機出現了。銷售部門要求光碟機動發動機需要一定光能才能運轉,光能以流明(Lumen)度量。這個信息對客戶很重要,因為下雨或多雲的天氣里,某些光碟機動發動機可能無法運轉。銷售部門要求為軟體增加對光碟機動發動機的支持,所以要定義一個新的行為。
行為3:查詢光碟機動發動機能夠正常運轉所需要的最小流明數,發動機返回一個整數。
再定義一個抽象類並把行為3轉換成Java方法,代碼如下:
代碼
public abstract SolarPoweredMotor extends Motor{
abstract public int getLumensToOperate();
『柒』 什麼是面向介面編程,它的好處是什麼
面向介面編程的意思是指在面向對象的系統中所有的類或者模塊之間的交互是由介面完成的。就是對各個功能函數的介面進行編程。好處么就是可移植性強,面向對象,編程靈活性高可維護性高。
『捌』 JAVA什麼是面向介面編程
不知道怎麼給你說清楚
形象一點,c語言是面向過程編程,就是按程序執行的順序編
而c++和java都是面向對象編程,他們把變數和方法都封裝到類裡面,通過對象執行程序
但是c++中的類是可以繼承的,而JAVA的不能繼承,只能通過實現介面來完成類似於c++繼承的功能,從這個角度看java是面向介面編程
『玖』 什麼是面向介面編程
什麼是介面?
-- 在表面上是由幾個沒有主體代碼的方法定義組成的集合體,有唯一的名稱,可以被類或其他介面所實現(或者也可以說繼承), 由關鍵詞 interface 修飾。
什麼是面向介面編程?
-- 在系統分析或架構設計中,每個層級的程序並不是直接提供程序服務,而是定義一組介面,通過實現介面來提供功能。面向介面編程實際是面向對象編程的一部分。
面向介面編程的優點?
1、介面的定義和實現分開(分開有什麼好處呢?)
首先,項目一般是由團隊共同開發來完成的,在其中,介面的定義一般是由架構師來設定,然後又編程人員來實現完成,架構師根據架構、設計規則來設定介面,把握項目的整體視圖和編寫規范,編程人員實現具體業務邏輯,分工明確,程序清晰。
其次,從實現上看,介面的定義時間很短,但介面的實現周期相對較長,若一個編程人員需要調用其他人員編寫的某個方法時,可以採用多態的方式獲取介面對象,來調用方法,這樣保證團隊共同完成開發。
2、介面可以有多個實現類,便於以後的業務擴展
什麼意思呢?
-- 比如實現類的業務需要擴展功能,此時可以採用重新實現介面的方式,這樣降低了程序的冗餘 和 一個類寫太多行代碼的尷尬。
另外,介面的多實現易於通過配置文件的方式配置介面的實現類(這個是指在spring中管理對象的時候)。
『拾』 什麼是面向介面編程及一個簡單實例
面向介面編程是一個很高級的概念了以前的面向對象編程,以java為例子,主要的操作針對對象來進行,把要處理的問題簡化分解成對象的方式來解決,對對象的使用主要是引用對象提供的方法後來的使用過程中,逐漸有人發現,當程序的內容不斷擴大,程序的編寫和完善需要更多的人員來合作完成的時候,面向對象的方式有些不便就很突出了,主要的就是類的繼承和方法的重寫,查詢起來和引用起來很多不便。所以現在有面向介面編程的理念提出來,介面就是標准,介面就是規范,但是介面沒有實現的方法,這樣避免了很多類的繼承的問題,特別在大型的程序的編寫方面有廣泛的應用。什麼是面向介面編程及一個簡單實例